Web フィード エントリを管理する方法 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
このトピックでは、Windows ランタイムにおける Atom Publication プロトコルの実装である Windows.Web.AtomPub 名前空間を使って、サービス ドキュメントにアクセスし、そこに含まれているフィード リソースに変更を加える方法について説明します。
必要条件
次の例は、JavaScript で記述されており、AtomPub のサンプルに基づいています。 JavaScript を使った Windows ランタイム アプリの作成についての一般的なヘルプは、「JavaScript を使った初めての Windows ランタイム アプリの作成」をご覧ください。このトピックでは、JavaScript の promise を使って非同期操作も実行します。このプログラミング パターンについて詳しくは、promise を使った JavaScript での非同期プログラミングに関するページをご覧ください。
Windows ランタイム アプリをネットワークに対応させるには、プロジェクトの Package.appxmanifest ファイルで必要なネットワーク機能を設定する必要があります。 アプリがクライアントとしてインターネット上のリモート サービスに接続する必要がある場合は、インターネット (クライアント) 機能が必要です。アプリがクライアントとしてホーム ネットワークまたは社内ネットワーク上のリモート サービスに接続する必要がある場合は、ホーム/社内ネットワーク機能が必要です。詳しくは、「ネットワーク機能を設定する方法」をご覧ください。
手順
1. サービス ドキュメント
コード例を見ていく前に、サービス ドキュメントを使って Web サービスのフィード コンテンツの構造を定義する方法について、基本を理解しておいてください。
サービス ドキュメントには、ワークスペース (workspace) 要素が少なくとも 1 つカプセル化されています。ワークスペースは、1 つ以上のコレクションを表します。つまり、個人ブログや Web ページなどの Web パブリケーションはワークスペースと考えられ、含まれているコレクションは個々のフィードを表します。個々のフィードにはさまざまなエントリが含まれます。
次の構文は、簡単なサービス ドキュメントの例です。
<?xml version="1.0" encoding='utf-8'?>
<service xmlns="http://www.w3.org/2007/app"
xmlns:atom="http://www.w3.org/2005/Atom">
<workspace>
<atom:title>Main Site</atom:title>
<collection
href="http://example.org/blog/main" >
<atom:title>My Blog Entries</atom:title>
<categories
href="http://example.com/cats/forMain.cats" />
</collection>
<collection
href="http://example.org/blog/pic" >
<atom:title>Pictures</atom:title>
<accept>image/png</accept>
<accept>image/jpeg</accept>
<accept>image/gif</accept>
</collection>
</workspace>
</service>
サービス ドキュメントを取得するには、関連付けられている Uri を retrieveServiceDocumentAsync に渡します。特定のフィード エントリをアプリで取得、編集、削除するには、個々のエントリに関連付けられている絶対 URI ごとに、取得した ServiceDocument を解析する必要があります。
2. 認証資格情報を使ったクライアントの初期化
以下の例では、フィード管理操作に Windows.Web.AtomPub 名前空間のクラスを使い、個々のフィード要素を表すために Windows.Web.Syndication 名前空間のクラスを使います。また、ほとんどの Web 発行サービスには、特定の形式の認証が必要となります。この機能は、Windows.Security 名前空間に用意されています。
次の例では、AtomPubClient インスタンスの初期化処理で、資格情報を設定して取り込んでいます。
//define some variables
// The default values for the site.
var baseUri = "http://<Your Wordpress Site>.wordpress.com/";
var user = "";
var password = "";
// The default Service Document and Edit 'URIs'
var editUri = "./wp-app.php/posts";
var serviceDocUri = "./wp-app.php/service";
var feedUri = "./?feed=atom";
var currentFeed = null;
var currentItemIndex = 0;
var client;
var item;
// Get current credentialS and create the AtomPub client
function createClient() {
client = new Windows.Web.AtomPub.AtomPubClient();
// Don't save the results to the client's cache
client.bypassCacheOnRetrieve = true;
if ((user !== "") && (password !== "")) {
var credential = new Windows.Security.Credentials.PasswordCredential();
credential.userName = user;
credential.password = password;
client.serverCredential = credential;
}
else {
client.serverCredential = null;
}
}
3. コレクション内への新しい投稿の作成
既にあるコレクションに新しい投稿を追加するには、新しい SyndicationItem オブジェクトを作り、そこに必要なコンテンツを設定します。SyndicationItem が完成したら、そのオブジェクトと、エントリについて簡潔に説明する文字列、さらにフィードの Uri を、AtomPubClient の createResourceAsync メソッドに渡します。
Uri コンストラクターは、渡された uriString が有効な URI ではない場合、例外をスローします。そのため、try/catch ブロックを使用して uriString を検証します。
非同期ネットワーク メソッドの多くは、呼び出す場合、例外を処理するようにコードを記述する必要があります。エラーについてよく理解し、適切な判断ができるように、例外ハンドラーは例外の原因についての詳しい情報を取得できます。詳しくは、「ネットワーク アプリで例外を処理する方法」をご覧ください。
createResourceAsync メソッドは、ネットワーク サーバーとの TCP 接続が確立できなかった場合や、Uri オブジェクトが有効な AtomPub や RSS フィードを指していない場合、例外をスローします。サンプル コードでは、onError 関数を使って、エラーが発生した場合に例外をキャッチし、例外に関する詳細な情報を出力します。
// Called when an async function generates an error.
function onError(err) {
displayError(err);
// Match error number with a WebErrorStatus value, in order to deal
// with a specific error.
var errorStatus = Windows.Web.WebError.getStatus(err.number);
if (errorStatus === Windows.Web.WebErrorStatus.unauthorized) {
displayLog("Wrong username or password!");
}
}
function createPost (uriString, postTitle, postContent, postSummary, postAuthor) {
var resourceUri;
try {
resourceUri = new Windows.Foundation.Uri(uriString);
} catch (error) {
displayLog("Error: Invalid URI");
return;
var syndicationItem;
item = new Windows.Web.Syndication.SyndicationItem();
item.title = new Windows.Web.Syndication.SyndicationText(postTitle);
item.summary = new Windows.Web.Syndication.SyndicationText(postSummary);
item.content = new Windows.Web.Syndication.SyndicationContent(postContent, Windows.Web.Syndication.SyndicationTextType.Text);
item.authors[0] = new Windows.Web.Syndication.SyndicationPerson(postAuthor);
// Note: Also other item fields can be set such as 'syndicationItem.Categories[0]'
return client.createResourceAsync(resourceUri, item.title.text, item);
}).done(function (result) {
if (result) {
displayLog("Posted at " + result.editUri.displayUri);
displayLog("New post created.");
}
}, onError);
4. コレクション内の投稿の編集
コレクション内に既にあるエントリを編集するには、関連付けられている Uri を SyndicationClient の retrieveFeedAsync メソッドに渡します。新しい値の SyndicationItem を準備し、そのオブジェクトを、エントリを取得するときに使った Uri と一緒に AtomPubClient の updateResourceAsync に渡します。
function editPost (uriString, postTitle, postContent, postSummary, postAuthor) {
var resourceUri;
try {
resourceUri = new Windows.Foundation.Uri(uriString);
} catch (error) {
displayLog("Error: Invalid URI");
return;
var updatedItem = new Windows.Web.Syndication.SyndicationItem();
updatedItem.title = new Windows.Web.Syndication.SyndicationText(postTitle);
updatedItem.summary = new Windows.Web.Syndication.SyndicationText(postSummary);
updatedItem.content = new Windows.Web.Syndication.SyndicationContent(postContent, Windows.Web.Syndication.SyndicationTextType.Text);
updatedItem.authors[0] = new Windows.Web.Syndication.SyndicationPerson(postAuthor);
// Note: Also other item fields can be set such as 'syndicationItem.Categories[0]'
client.updateResourceAsync(resourceUri, updatedItem).done(function () {
displayLog("Updating item completed.");
}
}, onError);
}
5. コレクションからの投稿の削除
コレクションからのエントリを削除するには、SyndicationItem インスタンスの editUri プロパティを AtomPubClient インスタンスの deleteResourceItemAsync メソッドに渡します。
function deletePost(uriString, currentFeed) {
var resourceUri;
try {
resourceUri = new Windows.Foundation.Uri(uriString);
} catch (error) {
displayLog("Error: Invalid URI");
return;
// If we retrieve the feed via the resourceUri then we will be logged in and will be
// able to modify/delete the resource.
client.retrieveFeedAsync(resourceUri).done(function (feed) {
currentFeed = feed;
currentItemIndex = 0;
displayLog("Got feed");
var title = "(no title)";
if (currentFeed.title) {
title = currentFeed.title.text;
}
displayLog("Title: " + title);
var currentItem = getCurrentItem();
if (currentItem) {
displayLog("EditUri: " + currentItem.editUri);
}
displayStatus("Fetching feed completed.");
}, onError);
client.deleteResourceItemAsync(currentItem).done(function() {
displayLog("Deleting item completed.");
// Our feed is now out of date. Re-fetch the feed before deleting something else.
currentFeed = null;
}, onError);
}
要約と次のステップ
このトピックでは、サービス ドキュメントを取得し、ドキュメント内で新しいコレクション エントリを追加したり、既にあるコレクション エントリに変更を加えたり、コレクション エントリを削除したりする方法を紹介しました。基本的なフィード取得の簡単なデモについては、「Web フィードにアクセスする方法」をご覧ください。
関連トピック
その他
promise を使った JavaScript での非同期プログラミングに関する記事
JavaScript を使った Windows ランタイム アプリのためのロードマップ
リファレンス
サンプル