Umpan RSS/Atom
API penting
Ambil atau buat konten Web paling populer dan terbaru menggunakan umpan sindikasi yang dihasilkan sesuai dengan standar RSS dan Atom menggunakan fitur di namespace Layanan Windows.Web.Syndication.
Apa itu umpan?
Umpan web adalah dokumen yang berisi sejumlah entri individual yang terdiri dari teks, tautan, dan gambar. Pembaruan yang dibuat pada umpan dalam bentuk entri baru yang digunakan untuk mempromosikan isi terbaru di seluruh Web. Konsumen konten dapat menggunakan aplikasi pembaca umpan untuk mengagregasi dan memantau umpan dari sejumlah penulis konten individual, mendapatkan akses ke konten terbaru dengan cepat dan nyaman.
Standar format umpan mana yang didukung?
Platform Windows Universal (UWP) mendukung pengambilan umpan untuk standar format RSS dari 0,91 hingga RSS 2.0, dan standar Atom dari 0,3 hingga 1,0. Kelas di namespace Layanan Windows.Web.Syndication dapat menentukan umpan dan item umpan yang mampu mewakili elemen RSS dan Atom.
Selain itu, format Atom 1.0 dan RSS 2.0 memungkinkan dokumen umpannya berisi elemen atau atribut yang tidak ditentukan dalam spesifikasi resmi. Seiring waktu, elemen dan atribut kustom ini telah menjadi cara untuk menentukan informasi khusus domain yang digunakan oleh format data layanan web lainnya seperti GData dan OData. Untuk mendukung fitur tambahan ini, kelas SyndicationNode mewakili elemen XML generik. Menggunakan SyndicationNode dengan kelas di namespace Layanan Windows.Data.Xml.Dom , memungkinkan aplikasi mengakses atribut, ekstensi, dan konten apa pun yang mungkin ada di dalamnya.
Perhatikan bahwa, untuk publikasi konten sindikasi, implementasi UWP dari Protokol Publikasi Atom (Windows.Web.AtomPub) hanya mendukung operasi konten umpan sesuai dengan standar Publikasi Atom dan Atom.
Menggunakan konten sindikasi dengan isolasi jaringan
Fitur isolasi jaringan di UWP memungkinkan pengembang mengontrol dan membatasi akses jaringan oleh aplikasi UWP. Tidak semua aplikasi mungkin memerlukan akses ke jaringan. Namun untuk aplikasi yang melakukannya, UWP menyediakan tingkat akses yang berbeda ke jaringan yang dapat diaktifkan dengan memilih kemampuan yang sesuai.
Isolasi jaringan memungkinkan pengembang untuk menentukan untuk setiap aplikasi cakupan akses jaringan yang diperlukan. Aplikasi tanpa cakupan yang sesuai yang ditentukan dicegah untuk mengakses jenis jaringan yang ditentukan, dan jenis permintaan jaringan tertentu (permintaan yang dimulai klien keluar atau permintaan masuk yang tidak diminta dan permintaan keluar yang dimulai klien). Kemampuan untuk mengatur dan menerapkan isolasi jaringan memastikan bahwa jika aplikasi disusupi, aplikasi hanya dapat mengakses jaringan di mana aplikasi telah secara eksplisit diberikan akses. Ini secara signifikan mengurangi cakupan dampak pada aplikasi lain dan pada Windows.
Isolasi jaringan memengaruhi elemen kelas apa pun di namespace Windows.Web.Syndication dan Windows.Web.AtomPub yang mencoba mengakses jaringan. Windows secara aktif memberlakukan isolasi jaringan. Panggilan ke elemen kelas di namespace Windows.Web.Syndication atau Windows.Web.AtomPub yang mengakibatkan akses jaringan mungkin gagal karena isolasi jaringan jika kemampuan jaringan yang sesuai belum diaktifkan.
Kemampuan jaringan untuk aplikasi dikonfigurasi dalam manifes aplikasi saat aplikasi dibuat. Kemampuan jaringan biasanya ditambahkan menggunakan Microsoft Visual Studio 2015 saat mengembangkan aplikasi. Kemampuan jaringan juga dapat diatur secara manual dalam file manifes aplikasi menggunakan editor teks.
Untuk informasi lebih rinci tentang isolasi jaringan dan kemampuan jaringan, lihat bagian "Kemampuan" di topik Dasar jaringan.
Cara mengakses umpan web
Bagian ini menunjukkan cara mengambil dan menampilkan umpan web menggunakan kelas di namespace Windows.Web.Syndication di aplikasi UWP Anda yang ditulis dalam C# atau JavaScript.
Prasyarat
Untuk memastikan aplikasi UWP Anda siap jaringan, Anda harus mengatur kemampuan jaringan apa pun yang diperlukan dalam file Package.appxmanifest proyek. Jika aplikasi Anda perlu terhubung sebagai klien ke layanan jarak jauh di Internet, maka kemampuan internetClient diperlukan. Untuk informasi selengkapnya, lihat bagian "Kemampuan" di topik Dasar-dasar jaringan.
Mengambil konten sindikasi dari umpan web
Sekarang kita akan meninjau beberapa kode yang menunjukkan cara mengambil umpan, lalu menampilkan setiap item individual yang dikandung umpan. Sebelum dapat mengonfigurasi dan mengirim permintaan, kita akan menentukan beberapa variabel yang akan kita gunakan selama operasi, dan menginisialisasi instans SyndicationClient, yang menentukan metode dan properti yang akan kita gunakan untuk mengambil dan menampilkan umpan.
Konstruktor Uri melempar pengecualian jika uriString yang diteruskan ke konstruktor bukan URI yang valid. Jadi kami memvalidasi uriString menggunakan blok try/catch.
Windows.Web.Syndication.SyndicationClient client = new Windows.Web.Syndication.SyndicationClient();
Windows.Web.Syndication.SyndicationFeed feed;
// The URI is validated by catching exceptions thrown by the Uri constructor.
Uri uri = null;
// Use your own uriString for the feed you are connecting to.
string uriString = "";
try
{
uri = new Uri(uriString);
}
catch (Exception ex)
{
// Handle the invalid URI here.
}
var currentFeed = null;
var currentItemIndex = 0;
var client = new Windows.Web.Syndication.SyndicationClient();
// The URI is validated by catching exceptions thrown by the Uri constructor.
var uri = null;
try {
uri = new Windows.Foundation.Uri(uriString);
} catch (error) {
WinJS.log && WinJS.log("Error: Invalid URI");
return;
}
Selanjutnya kita mengonfigurasi permintaan dengan mengatur kredensial Server apa pun (properti ServerCredential), kredensial proksi (properti ProxyCredential), dan header HTTP (metode SetRequestHeader) yang diperlukan. Dengan parameter permintaan dasar yang dikonfigurasi, objek Uri yang valid, dibuat menggunakan string URI umpan yang disediakan oleh aplikasi. Objek Uri kemudian diteruskan ke fungsi RetrieveFeedAsync untuk meminta umpan.
Dengan asumsi konten umpan yang diinginkan dikembalikan, kode contoh berulang melalui setiap item umpan, memanggil displayCurrentItem (yang kami tentukan berikutnya), untuk menampilkan item dan kontennya sebagai daftar melalui UI.
Anda harus menulis kode untuk menangani pengecualian ketika Anda memanggil sebagian besar metode jaringan asinkron. Handler pengecualian Anda dapat mengambil informasi yang lebih rinci tentang penyebab pengecualian untuk lebih memahami kegagalan dan membuat keputusan yang sesuai.
Metode RetrieveFeedAsync melempar pengecualian jika koneksi tidak dapat dibuat dengan server HTTP atau objek Uri tidak menunjuk ke umpan AtomPub atau RSS yang valid. Kode sampel JavaScript menggunakan fungsi onError untuk menangkap pengecualian apa pun dan mencetak informasi yang lebih rinci tentang pengecualian jika terjadi kesalahan.
try
{
// Although most HTTP servers do not require User-Agent header,
// others will reject the request or return a different response if this header is missing.
// Use the setRequestHeader() method to add custom headers.
client.SetRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
feed = await client.RetrieveFeedAsync(uri);
// Retrieve the title of the feed and store it in a string.
string title = feed.Title.Text;
// Iterate through each feed item.
foreach (Windows.Web.Syndication.SyndicationItem item in feed.Items)
{
displayCurrentItem(item);
}
}
catch (Exception ex)
{
// Handle the exception here.
}
function onError(err) {
WinJS.log && WinJS.log(err, "sample", "error");
// Match error number with an ErrorStatus value.
// Use Windows.Web.WebErrorStatus.getStatus() to retrieve HTTP error status codes.
var errorStatus = Windows.Web.Syndication.SyndicationError.getStatus(err.number);
if (errorStatus === Windows.Web.Syndication.SyndicationErrorStatus.invalidXml) {
displayLog("An invalid XML exception was thrown. Please make sure to use a URI that points to a RSS or Atom feed.");
}
}
// Retrieve and display feed at given feed address.
function retreiveFeed(uri) {
// Although most HTTP servers do not require User-Agent header,
// others will reject the request or return a different response if this header is missing.
// Use the setRequestHeader() method to add custom headers.
client.setRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
client.retrieveFeedAsync(uri).done(function (feed) {
currentFeed = feed;
WinJS.log && WinJS.log("Feed download complete.", "sample", "status");
var title = "(no title)";
if (currentFeed.title) {
title = currentFeed.title.text;
}
document.getElementById("CurrentFeedTitle").innerText = title;
currentItemIndex = 0;
if (currentFeed.items.size > 0) {
displayCurrentItem();
}
// List the items.
displayLog("Items: " + currentFeed.items.size);
}, onError);
}
Pada langkah sebelumnya, RetrieveFeedAsync mengembalikan konten umpan yang diminta dan kode contoh harus bekerja iterasi melalui item umpan yang tersedia. Masing-masing item ini diwakili menggunakan objek SyndicationItem yang berisi semua properti item dan konten yang diberikan oleh standar sindikasi yang relevan (RSS atau Atom). Dalam contoh berikut, kami mengamati fungsi displayCurrentItem yang bekerja melalui setiap item dan menampilkan kontennya melalui berbagai elemen UI bernama.
private void displayCurrentItem(Windows.Web.Syndication.SyndicationItem item)
{
string itemTitle = item.Title == null ? "No title" : item.Title.Text;
string itemLink = item.Links == null ? "No link" : item.Links.FirstOrDefault().ToString();
string itemContent = item.Content == null ? "No content" : item.Content.Text;
//displayCurrentItem is continued below.
function displayCurrentItem() {
var item = currentFeed.items[currentItemIndex];
// Display item number.
document.getElementById("Index").innerText = (currentItemIndex + 1) + " of " + currentFeed.items.size;
// Display title.
var title = "(no title)";
if (item.title) {
title = item.title.text;
}
document.getElementById("ItemTitle").innerText = title;
// Display the main link.
var link = "";
if (item.links.size > 0) {
link = item.links[0].uri.absoluteUri;
}
var link = document.getElementById("Link");
link.innerText = link;
link.href = link;
// Display the body as HTML.
var content = "(no content)";
if (item.content) {
content = item.content.text;
}
else if (item.summary) {
content = item.summary.text;
}
document.getElementById("WebView").innerHTML = window.toStaticHTML(content);
//displayCurrentItem is continued below.
Seperti yang disarankan sebelumnya, jenis konten yang diwakili oleh objek SyndicationItem akan berbeda tergantung pada standar umpan (RSS atau Atom) yang digunakan untuk menerbitkan umpan. Misalnya, umpan Atom mampu menyediakan daftar Kontributor, tetapi umpan RSS tidak. Namun, elemen ekstensi yang disertakan dalam item umpan yang tidak didukung oleh salah satu standar (misalnya, elemen ekstensi Dublin Core) dapat diakses menggunakan properti SyndicationItem.ElementExtensions lalu ditampilkan seperti yang ditunjukkan dalam contoh kode berikut.
//displayCurrentItem continued.
string extensions = "";
foreach (Windows.Web.Syndication.SyndicationNode node in item.ElementExtensions)
{
string nodeName = node.NodeName;
string nodeNamespace = node.NodeNamespace;
string nodeValue = node.NodeValue;
extensions += nodeName + "\n" + nodeNamespace + "\n" + nodeValue + "\n";
}
this.listView.Items.Add(itemTitle + "\n" + itemLink + "\n" + itemContent + "\n" + extensions);
}
// displayCurrentItem function continued.
var bindableNodes = [];
for (var i = 0; i < item.elementExtensions.size; i++) {
var bindableNode = {
nodeName: item.elementExtensions[i].nodeName,
nodeNamespace: item.elementExtensions[i].nodeNamespace,
nodeValue: item.elementExtensions[i].nodeValue,
};
bindableNodes.push(bindableNode);
}
var dataList = new WinJS.Binding.List(bindableNodes);
var listView = document.getElementById("extensionsListView").winControl;
WinJS.UI.setOptions(listView, {
itemDataSource: dataList.dataSource
});
}