Управление записями веб-каналов (HTML)

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]

В этом разделе показано, как получить доступ к сервисному документу и изменить содержащиеся в нем ресурсы веб-канала, используя пространство имен Windows.Web.AtomPub, которое является реализацией протокола публикации Atom среды выполнения Windows.

Необходимые условия

В следующих примерах, основанных на примере AtomPub, используется JavaScript. Общую справку по созданию приложения среды выполнения Windows на JavaScript см. в разделе Создание первого приложения среды выполнения Windows на JavaScript. Для завершения асинхронных операций в этом разделе также используются объекты Promise в JavaScript. Подробнее об этой технике программирования см. в разделе об асинхронном программировании на JavaScript с использованием объектов Promise.

Чтобы подготовить приложение среды выполнения Windows для работы в сети, необходимо настроить соответствующие возможности сетевого подключения в файле проекта Package.appxmanifest. Если приложению нужно подключаться в качестве клиента к удаленным службам в Интернете, для этого требуется возможность Интернет (клиент). Если же нужно подключаться в качестве клиента к удаленным службам в домашней или рабочей сети, требуется возможность Домашняя/рабочая сеть. Подробнее: Как настроить возможности сети.

Инструкции

1. Сервисные документы

Перед тем как перейти к примеру кода, рассмотрим вкратце использование сервисных документов для определения структуры содержимого веб-канала для веб-службы.

Сервисный документ инкапсулирует как минимум один элемент рабочей области, который представляет одну или несколько коллекций. Другими словами, веб-публикации, такие как личные блоги и веб-страницы, рассматриваются как рабочие пространства, а содержащиеся коллекции представляют личные веб-каналы, каждый из которых содержит ряд записей.

Следующий синтаксис — короткий пример сервисного документа:

<?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. Для получения, изменения или удаления отдельных записей веб-канала приложению нужно будет проанализировать полученный ServiceDocument на наличие абсолютных URI, связанных с отдельными записями.

2. Инициализация клиента с учетными данными для проверки подлинности

Следующие примеры используют классы в пространстве имен Windows.Web.AtomPub для операций управления веб-каналом, а классы в пространстве имен Windows.Web.Syndication — для представления отдельных элементов веб-канала. Кроме того, большинство служб веб-публикации требуют проверки подлинности, функциональные возможности которой предоставляются пространством имен 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 веб-канала в метод createResourceAsync на AtomPubClient.

Конструктор Uri создает исключение, если параметр uriString, переданный конструктору, не является допустимым URI. Поэтому проверяем uriString при помощи блока Try/Catch.

При вызове большинства асинхронных сетевых методов вы должны написать код для обработки исключений. Обработчик исключений может получить подробную информацию о причине исключения, чтобы разобраться в проблеме и принять необходимые меры. Подробнее см. в разделе об обработке исключений в сетевых приложениях.

Метод createResourceAsync создает исключение, если не удается установить подключение к HTTP-серверу или объект 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 в метод retrieveFeedAsync на SyndicationClient. Подготовьте SyndicationItem с новыми значениями и передайте объект в метод updateResourceAsync на AtomPubClient вместе с Uri, используемым для получения этой записи.

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 в метод deleteResourceItemAsync экземпляра AtomPubClient.

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);
    }

Краткая сводка и дальнейшие действия

В этом разделе мы получили сервисный документ, добавили новые и изменили существующие записи коллекции, а также удалили записи коллекции в документе. Демонстрацию простого получения веб-канала см. в разделе Получение доступа к веб-каналу.

Связанные разделы

Прочие ссылки

Асинхронное программирование на JavaScript с использованием объектов Promise

Как настроить возможности сети

Обработка исключений в сетевых приложениях

Как получить доступ к веб-каналу

Схема создания приложений среды выполнения Windows на JavaScript

Ссылки

AtomPubClient

SyndicationItem

Windows.Web.AtomPub

Windows.Web.Syndication

Примеры

Пример AtomPub

Пример Syndication