Web 上總有一些站點提供系列的文章、事件和其他記錄事項,用於分享和交叉引用。隨著 Web 很大一部分成為會話式的社區,社區中的很多人走到一起為這類交換和交叉引用開發一種基於 XML 的標准。Atom 就是這些努力的結晶,它是一種交換 Web 元數據的格式和 API。Uche Ogbuji 在本文中介紹了 Atom。請在本文的 討論論壇上與作者和其他讀者分享您對本文的想法。
RSS之爭在 XML 社區中人所共知。Netscape 把這種輕量級的格式拼湊在一起用於連鎖,即把網站中傳輸的信息聚集到門戶中。由於從這個低調的起點開始,甚至連這個縮寫詞的含義也受到了爭議。Weblogs 和下一代門戶已經使 Web 資源描述的交換成為一種普遍而重要的現象。各種流派的 RSS 統治著元數據交換的世界,無休無止的 RSS 紛爭增加了風險。
長期卷入這場沖突的一位知名技術專家是 IBM Emerging Technology Group 的 Sam Ruby。2003 年中期,Ruby 提議 RRS 及相關連鎖格式的各方面的專家和用戶共同合作開發下一代格式。部分目的是建立一個顧及各種派別的標准,從而平息 RSS 紛爭。另一個目標是建立技術上更加完善的設計來代替不同的 RSS 風格,根據很多 RSS 用戶的實踐經驗對這種實用的設計進行折衷,使新的格式與 Web 的體系結構和文化協調一致。大批開發人員和作者爭相加入該項目,顯然是因為對 RSS 中無休無止的硝煙和陰謀感到失望,期望對所討論的技術問題出現一種新的解決方法。
該項目最初稱為 Echo,但由於商標問題而更名為 Atom。如 Atom Wiki 所宣稱的那樣,該項目要建立“連鎖、存檔和編輯情節式站點的規范”。我認為,Atom 處理領域的定義特征不僅僅是自然分解成情節的 Web 站點,還包括那些與其他站點交互中具有會話性質的 Web 站點。情節往往帶有對其他站點上類似實體的交叉索引,Atom 就是為了把這類交換粘結在一起。
Atom 令人矚目有很多原因,最突出的一點是盡管作為一種社區規范,作為有史以來組織最為龐大的委員會磋商的結果,它仍保持了簡單性。Atom 包括 Syndication Format Specification(連鎖格式規范)(目前為 0.3 版,草案 2),它是表示 Web 資源信息的 XML 格式;和 API Specification(API 規范)(目前為 0.9 版),基於 HTTP 檢索和修改 Web 資源信息的一些約定。雖然目前只有 API 規范正式提交給了Internet 工程任務組(IETF),這兩種規范都采用 Internet Draft 的格式編寫,以期最終成為 RFC 標准。除了 XML 語法之外,Atom 還使用 Web Ontology Language (OWL)開發了 RDF 形式。本文中對 Atom 的介紹主要放在 XML 格式規范上,但在適當的地方也會涉及到 API。所有的 Atom 規范仍在積極地開發之中,在標准化之前還可能發生變化,雖然基本的 Atom 風格很可能不變。
創建 Web 資源
假設您要創辦一份格律詩的 Web 雜志,稱為 Stanza Web。您可以使用 Atom 更新站點、列出新的詩篇、文章和其他專輯、從相關的其他站點收集信息。要做的第一步是上傳歡迎讀者的文章。為此,Atom API 規定要把內容包裝在由 Atom entry 元素組成的 XML 文檔中,並把該文檔作為 HTTP POST 消息發給特定 URI PostURI上的 Web 服務器。清單 1 就是一個這樣的 XML 文檔。
清單 1. 發送到 PostURI 創建入口的 Atom 條目
<?XML version="1.0" encoding="utf-8"?>
<entry XMLns="http://purl.org/atom/ns#">
<title>Welcome to Stanza Web</title>
<author>
<name>Uche Ogbuji</name>
<!-- May also contain a URL and e-mail address -->
</author>
<link rel="alternate" type="text/Html"
href="http://stanzaweb.art/2004-06-01/welcome"/>
<!-- Time in UTC -->
<modified>2004-06-01T10:11:12Z</modifIEd>
<content type="application/xHtml+xml" XML:lang="en">
<div class="article" XMLns="http://www.w3.org/1999/xHtml">
<p>Welcome to
<a href="http://stanzaweb.art/">Stanza Web</a>.
Come back often to keep track of the best in modern poetry.
</p>
<p>This site is powered by
<a href="http://atomenabled.org">Atom</a>
</p>
</div>
</content>
</entry>
Atom 格式中的所有元素必須在名稱空間 http://purl.org/atom/ns# 中,或者是在根據擴展規則尚未設定的外部名稱空間中。 entry 元素必須包含以下子元素:
entry 還可以包含其他元素,如 id 、 contributor 和 content ,後者通常在定位 PostURI 時出現,就像本例這樣。
所有這些條目信息在服務器向客戶發送關於已有資源的信息時意義非常明顯,但是在定位 PostURI 時每個元素的作用在規范中沒有清楚地說明。 title 和 author 元素大概用於設置創建資源時的相關元數據。 modifIEd 元素向服務器提供了如何給出條目時間戳的線索,盡管如果資源的時間戳是按照服務器策略而非提交者的指令設定的,服務器應該如何對這種情況作出反應沒有明確的規定。 link 大概是告訴服務器如何為創建的資源構造 URI,以及為那個資源的表示(至少要有一種)指定什麼樣的 Intenet 媒體類型,雖然這樣會引起更加苛刻的策略問題。
content 元素可能用於建立所創建資源的主體。內容甚至可以是二進制的形式,可以使用 MIME 的所有能力。在這個例子中,內容被設為 XHTML div 。如果上傳的資源最終將和更大的 Web 頁面結合起來顯示——Weblog 中很常見的情況——這是一種很好的辦法。其他情況下,可能合理的做法是在內容中發送完整的 XHTML 文檔(根元素為 html )。當然發送其他的內容格式也是完全有效的,如 Html、普通文本、甚至圖像或者音頻文件。如果要這樣做,必須保證正確地設置各種不同的媒體類型屬性。
Atom 發現
現在新建的網站上已經有了一個歡迎頁面,您希望具有相同愛好的人能夠找到它。其中一些人可能想把您的 Atom 連鎖信息放到他們自己的網站上。一些人則希望評論您的消息。為了使 Atom 實現這類功能,可以更新 Web 站點並在 HTML 頭中增加一些特殊的 Atom 專用鏈接。清單 2 中的 Html 片段說明了這些鏈接的用法。
清單 2. Html 頭中用於發現 Atom 相關 URI 的鏈接
<Html>
<head>
<title>Stanza Web</title>
<link rel="service.post" type="application/x.atom+XML"
href="http://stanzaweb.art/atom-post"
title="Stanza Web"/>
<link rel="service.feed" type="application/x.atom+XML"
href="http://stanzaweb.art/atom-feed"
title="Stanza Web"/>
</head>
<body> ... </body>
</Html>
在 清單 2 中,第一個 link 元素(紅色)有一個聯系值 service.post 提供了整個站點的 PostURI,通常用於創建新的文章。不同文章的網頁很可能有不同的 PostURI 鏈接以便建立那篇文章的評論。它可能還有一個鏈接 rel="service.edit" ,提供一個 EditURI。向這個 URI 發送一個 HTTP GET 消息就可以得到適合編輯的表示形式,然後使用 HTTP POST 發送更新的內容。第二個 link 元素(藍色)有一個聯系值 service.feed ,提供了 FeedURI。Atom 客戶可以發送 HTTP GET 請求來檢索完整的 Atom 提要。
Atom API 規范中沒有直接處理安全問題,但預計會出現用於各種 Atom API 操作的支持基於 HTTP 驗證的實現。
Atom 提要
理想情況下,讀者會來到 Stanza Web,閱讀文章並決定是否會再回來看看。然後,他們可以讓 Atom 工具指向該站點閱讀其 Atom FeedURI。任何時候,您都可以訪問 FeedURI 檢索站點提要,通常表示最新的或者變更的元數據。清單 3 給出了一份 Atom 格式的提要。
清單 3. 從 FeedURI 檢索的完整 Atom 提要
<?XML version="1.0" encoding="utf-8"?>
<feed version="0.3" XMLns="http://purl.org/atom/ns#">
<title>Schema Web</title>
<link rel="alternate" type="text/Html"
href="http://stanzaweb.art/"/>
<modified>2004-06-01T10:11:12Z</modifIEd>
<author>
<name>Uche Ogbuji</name>
</author>
<entry XMLns="http://purl.org/atom/ns#">
<title>Welcome to Stanza Web</title>
<author>
<name>Uche Ogbuji</name>
</author>
<link rel="alternate" type="text/Html"
href="http://stanzaweb.art/2004-06-01/welcome"/>
<modified>2004-06-01T10:11:12Z</modifIEd>
<content type="application/xHtml+xml" XML:lang="en">
<div class="article" XMLns="http://www.w3.org/1999/xHtml">
<p>Welcome to
<a href="http://stanzaweb.art/">Stanza Web</a>.
Come back often to keep track of the best in modern poetry.
</p>
<p>This site is powered by
<a href="http://atomenabled.org">Atom</a>
</p>
</div>
</content>
</entry>
</feed>
最頂層的元素是 feed ,它包括新增文章的 entry 元素。 feed 的其他子元素傳達了關於整個站點的元數據。帶有 rel="alternate" type="text/Html" 的 link 作為替代表示給出了站點的可閱讀表示。Atom 工具也可使用 modifIEd 元素確定站點的新內容是什麼時候增加的。
結束語
Atom 規范還需要大量的工作,仍有一些不足,比如關於個人的 URL 用元素的內容而非屬性表示。在 Atom 最終成為標准之前還有充分的時間修正這些問題。已經有幾種試驗性的 Atom 實現,倘若能夠貢獻您的才智,Atom 社區是非常開放的。不要忘記,如果本文引起了您的注意,請在 Thinking XML討論論壇 上提交您的想法。