Управление записями веб-каналов (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
Ссылки
Примеры