如何管理 Web 订阅源条目 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
本主题介绍如何使用 Windows.Web.AtomPub 命名空间访问服务文档并修改它所包含的订阅源资源,该命名空间是 Atom Publication Protocol 的 Windows 运行时实现。
先决条件
以下示例使用 JavaScript,且基于 AtomPub 示例。 有关创建使用 JavaScript 的 Windows 运行时应用的常规帮助,请参阅创建第一个采用 JavaScript 的 Windows 运行时应用。此外,在本主题中使用 JavaScript Promise 来完成异步操作。有关此编程模式的详细信息,请参阅在 JavaScript 中使用 Promise 进行异步编程。
为了使你的 Windows 运行时应用能够使用网络,你必须设置在项目 Package.appxmanifest 文件中所需的任何网络功能。 如果你的应用需要作为客户端连接到 Internet 上的远程服务,则“Internet (客户端)”功能是必需的。如果应用需要作为客户端连接到家庭网络或工作网络上的远程服务,则“家庭/工作网络”****功能是必需的。有关详细信息,请参阅如何设置网络功能。
说明
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。
当你调用大部分异步网络方法时,必须编写代码以处理异常。异常处理程序可以检索关于异常原因的更详细的信息,以更好地了解此次失败,并作出适当的判定。有关详细信息,请参阅如何处理网络应用中的异常。
如果不能与 HTTP 服务器建立连接,或者 Uri 对象没有指向有效的 AtomPub 或 RSS 订阅源,createResourceAsync 方法会引发异常。如果发生错误,示例代码使用 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. 从集合中删除发布
要从集合中删除条目,将 editUri 属性从 SyndicationItem 实例传递到 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 订阅源。
相关主题
其他
使用 JavaScript 中的 Promises 进行异步编程
使用 JavaScript 的 Windows 运行时应用的路线图
参考
示例