如何管理網頁摘要項目 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
這個主題會顯示如何使用 Windows.Web.AtomPub 命名空間來存取服務文件並修改它所含的摘要資源,這個命名空間是 Atom 發佈通訊協定的 Windows 執行階段實作。
先決條件
下列範例使用 JavaScript,並且使用 AtomPub 範例做為依據。 如需使用 JavaScript 建立 Windows 執行階段應用程式的一般協助,請參閱使用 JavaScript 建立您的第一個 Windows 執行階段應用程式。另外,這個主題中使用 JavaScript Promise 來完成非同步操作。如需這種程式設計模式的詳細資訊,請參閱使用 Promise 在 JavaScript 的非同步程式設計。
若要確保 Windows 執行階段應用程式的網路可正常運作,您必須在專案 Package.appxmanifest 檔案中設定所需的任何網路功能。 如果應用程式需要以用戶端的形式連線到網際網路上的遠端服務,則需要 [網際網路 (用戶端)] 功能。如果應用程式需要以用戶端的形式連線到家用網路或工作場所網路的遠端服務,則需要 [家中\公司網路]**** 功能。如需詳細資訊,請參閱如何設定網路功能。
指示
1. 服務文件
檢閱範例程式碼之前,最好先初步了解如何使用服務文件來定義 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 命名空間中的類別用於表示個別摘要元素。此外,大部分的網頁發佈服務都需要某種形式的驗證,這個功能是由 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 方法。
如果傳遞給建構函式的 uriString 的不是有效 URI,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. 刪除集合中的文章
若要刪除集合中的項目,請將 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);
}
摘要與後續步驟
在這個主題中,我們在該文件內抓取服務文件,新增集合項目、修改現有的集合項目,和刪除集合項目。如需基本摘要抓取的快速示範,請參閱如何存取網頁摘要。
相關主題
其他
使用 Promise 在 JavaScript 的非同步程式設計
使用 JavaScript 建立 Windows 執行階段應用程式的藍圖
參考
範例