如何管理 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 进行异步编程

如何设置网络功能

如何处理网络应用中的异常

如何访问 Web 订阅源

使用 JavaScript 的 Windows 运行时应用的路线图

参考

AtomPubClient

SyndicationItem

Windows.Web.AtomPub

Windows.Web.Syndication

示例

AtomPub 示例

综合示例