“對象網絡”:用于Web API的數據鏈接
作者 Jeevak Kasarkod 譯者 高翌翔
當您努力學習新的 Web API 時感到不堪重負了嗎?您是否覺得花費了大量精力用于處理不兼容的數據格式,而這些格式來自于不同 Web API 的同一對象?ThoughtWorks 公司的 Duncan Cragg 正在致力于一個名為“ 對象網絡(Object Network)” 的項目,該項目旨在通過通用數據定義和訪問格式來消除這類學習曲線,并且最重要的是,通過建立全球鏈接數據基礎結構來放大網絡效應。InfoQ 采訪了 Duncan Cragg,從而揭示付出這些努力的深層動機和原因,還有 API 開發者應如何將 API 發布到此數據網絡、以及如何從中提取數據。
InfoQ:對象網絡(Object Network)是什么?
盡管這個概念幾乎簡單得顯而易見,并且一經提出便無懈可擊,然而或許沒人相信它真的有可能實現:
并非 ProgrammableWeb 網站上列出那些迥然不同、互不兼容的4000多個 API,為什么不能只用一種方式來公開來自這些網站和服務的數據呢?
如果 推ter、非死book、Flickr 和 Google 都有用戶和照片,那么為什么要用 4 種不同的方法去訪問它們、而且是以 4 種互不兼容格式?只定義一種方法、及單一的格式,因此我們只需編寫一個客戶端庫,而不是 4 個、更不是 4000 個!
盡管 API 的增長引人矚目:一幅急劇上升的圖形。但是與之相比,20世紀 90 年代的網站增長則是爆炸式的!如果我們能夠對一些基本的、簡單協議和格式達成一致,那么我相信,在“數據網絡” 中,我們在 API 方面同樣能夠實現類似的飛速增長。我們需要一種“適用于 API 的 HTML”——一些有關檢索 JSON 的約定和一些有關 JSON 形式的預期——這真的很簡單!
這正是對象網絡(Object Network)登臺亮相之際。
在對象網絡中發布 API 只需遵守簡單的規范,包括有關 HTTP 和 JSON 的基本約定,以及用于通用數據的任意數量的格式,包括聯系信息、日歷事件、新聞、文章和消息源、媒體元數據、評論和回復、產品等。
按照這些模式,您網站中的數據可以加入全球互聯的“數據數據基礎結構(data fabric)”。在您的網站問世之前,那些已存在的客戶或客戶代碼就可以訪問到您的數據。
InfoQ:為何需要對象網絡(Object Network)?
那么問題在于,每個 API 都是不同的、而且需要不同的位于 HTTP 之上的協議進行通訊,還需要針對不同的 JSON 響應分別解析。但是我們總是力爭在這個行業中通過共享代碼和通用標準來減少低效。
作為服務端開發者,發布到對象網絡(Object Network)以后,通過共享客戶端代碼及網站間的互聯可以擴展您的數據范圍。您也無需花費大量時間來設計您的接口,因為當您來實現它時所有的協議約定和格式都將整理成冊。或者您可以與其他人一起定義適用于特殊情況和領域的新的對象網絡(Object Network)格式。毫無疑問,還將會出現一些框架,從而將現存的和新的數據便捷地發布到對象網絡(Object Network)中。
作為使用對象網絡(Object Network)接口的客戶端開發者,您可以復用通用客戶端代碼,例如對獲取鏈接和緩存數據的處理、轉換為基本的 HTML 等諸如此類的代碼。您還將理解一些通用數據類型(common data types),并且可以提供一些頂層的實用功能,例如把若干聯系人對象繪制在一張地圖上。最后但同樣重要的是,再多的數據也將僅有一種鏈接方式,且允許跨站點導航和數據消費。
InfoQ:什么是在語義網(Semantic Web)或鏈接數據(Linked Data)標準、或者 REST 的超媒體約束中所沒有的,而在對象網絡(Object Network)提供了?
大多數開發者(包括我在內)沒有時間或耐心去學習或從事任何看起來過于復雜或需要太多投入的事情!我認為正是語義網(Semantic Web[1])或鏈接數據(Linked Data[2])、還有更加奇特的 REST 中的諸多模式、解釋和參數嚇跑了開發者。
大體上,據我所知,一般的 API 開發者并不認為 RDF[3]非常適合于發布他們的數據。而 RSS 1.0[4]不過是其中的數據點。JSON-LD[5]可能是朝著正確方向的一個開始,但是我認為它仍被視為受累于過多的語義網包袱。它好像也沒有設置任何與 HTTP 用法或 REST 風格應用程序有關的約定。此外,似乎沒有任何與數據更新有關的內容。
同樣,我看不出有任何證據表明,一般的 API 開發者會非常重視修正 REST。如果正確實現 REST 被認為是如此容易,那么所有所謂的“REST API”其實是REST 風格的!
開發者需要更簡單的工作模式:一種可以讓他們的生活變得更簡單的模式,并通過一種適用于數據的通用語言來提供語義網帶來的全部好處,此外,還能提供 REST 帶來的全部好處,即互操作性(interoperability)和可擴展性(scalability)——“ 可混合性(mashability)和可緩存性(cacheability)”。
大多數人都說不出,如何以簡單的 JSON 形式來發布語義網的鏈接數據,或者如何滿足每一個 REST 約束,從而通過自描述(Self-descriptiveness)來實現從無狀態(Statelessness)到超媒體(Hypermedia)的轉變。
然而,我只需短短幾行代碼就能展示,如何使用簡單的 JSON 模板將您的數據發布到對象網絡(Object Network)中、如何在對象之間獲取超鏈接、以及在您的 HTTP 消息中需要放些什么。而且數據更新是對象網絡(Object Network)語言的一部分。
其他人可能會爭論,對象網絡(Object Network)是否是真正的 REST 風格,或者與鏈接數據相比是更好還是更差——我認為答案顯而易見,分別是“是”和“更好”!我就想讓人們談論、共享、并交付它。將數據交付到互聯的動態數據全球網絡。
顯然,不但是許多語義網和鏈接數據源,而且還有它們使用的詞匯,二者都極具價值。二者皆可復用并重新發布到對象網絡(Object Network)中,作為龐大的靜態數據和對象類型語義來使用。應該有種相當自動的轉換,從而實現從 rdf+xml 資源到鏈接對象網絡(Object Network)JSON 的轉換。
同樣,所謂的“REST API”——全部 4000 多個 API——提供了巨大而富饒的實用數據礦藏,它們都可以被簡單修改,從而融入對象網絡(Object Network)之中,可能會使用某些工具來完成,例如 ql.io。
InfoQ:對于對象編程模型與對象網絡(Object Network)中數據模型之間存在的阻抗失衡(impedance mismatch),您打算如何彌合?
我認為這對于分布式系統而言大部分都是可接受的,當您的“分布單元”是不錯的數據塊,而不是進程、過程或方法調用的時候工作效果最佳。同樣,當您執行的不是同步以及位于脆弱的同步鎖下地操作,而是異步、無狀態、且等冪[6]地操作時,事態會更易于管理。
因此我認為任何人都不會過多地抱怨我沒在對象網絡(Object Network)中為那些對象公布 RMI[7](遠程方法調用)接口!
對象網絡(Object Network)中的“對象(Object)”一詞實際上源于 JSON 中的字母“O”:實際上,它就是一個序列化的哈希表。所以它看起來可能更像是 JSON DTO[8],不過其具有嚴格的格式或類型結構、URL、可鏈接到其他對象的內容、以及可更改的內容。
我把對象網絡(Object Network)中的對象視為一些由各自服務器“繪制”出來的具有公共狀態的對象。
理想狀況下,它們應通過狀態依賴來工作——就像電子表格:“這個對象的狀態依賴于那個對象的狀態”。我已發表了一些有關此編程模型的細節——我稱之為“Functional Observer”(功能觀察者)或“FOREST”——就在“REST: From Research to Practice”(REST:從研究到實踐)這本書的某一章中(參見 http://forest-roa.org——請注意,在那些早期資料中我曾把它稱之為“Object Web”)。
但是,整個那部分內容都不是必須的:在對象網絡(Object Network)接口之后,您可以用任何喜歡的方式來繪制您自己的對象。我之所以首先重點解釋那些最簡單的模式——是因為只有先學走才能再學跑(學習更高級內容)!
InfoQ:對象網絡(Object Network)的目前進展狀況如何?接下來有何打算?
迄今為止,主要涉及一些 ThoughtWorks 的客戶和同事,不過我看到外界對當前的對象網絡(Object Network) 博文系列的興趣頗多。我也經常做講座和寫文章來解釋這些想法——總之我會抓住任何機會來解釋這些想法!(雖然歷經數次更名,但是現在已步入正軌,從今以后我將稱之為“對象網絡(Object Network)”。)
我在 GitHub 上有些 Javascript 代碼(必須要進行更新)實現了瀏覽器客戶端——即對象網絡(Object Network)查看器。您可以使用它通過鏈接對象進行導航、獲取投票變化或刷新。它也了解不同的對象類型,因此可以提供那些類似在地圖上查看聯系人的功能。該計劃還將提供一個 Javascript 庫,以便當客戶端應用程序使用對象網絡(Object Network)的數據時重用該庫。它也應該可與 Node.js 結合運行在服務器上,用于普通頁面的裝配。
進一步看,我在 GitHub 還有一個稱為“NetMash”的 Java 代碼庫,其中有 Android 對象網絡(Object Network)查看器和服務器。目前來看,那些內容在很大程度上具有實現性:具有更多有關異步和雙向數據更新的高級功能。
InfoQ:一個人如何才能參與到對象網絡(Object Network)項目中?
必須做的有:(1) 加入此 Google Group,還有 (2) 跟隨此此系列博文,正如它所寫的那樣!
然后就是發布!其實很簡單——您可以把簡單的 JSON 模板和您現有的 Web 棧一起使用,或者甚至發布若干靜態或預生成的 JSON 文件。正如我所說,我們需要發布的第一份數據是已經可用的、且具有較少的可訪問形式。我們將繼續致力于一些服務端框架或類庫支持,毫無疑問,發布將變得更輕松。
那么我們就可以在 JavaScript 查看器中查看這一切,或者您可以開始編寫基于 JavaScript 庫代碼的特色應用——當然要等到一切準備就緒時。當然,您完全可以使用您的 Javascript 專家級技能與我一起編寫那些代碼。
譯注
[1] Semantic Web,即語義網。語義網是一個由萬維網聯盟的蒂姆·伯納斯-李(Tim Berners-Lee)在 1998 年提出的概念,其核心是:通過給萬維網上的文檔(如:HTML)添加能夠被計算機所理解的語義(Meta data),從而使整個互聯網成為一個通用的信息交換媒介。語義萬維網通過使用標準、標記語言和相關的處理工具來擴展萬維網的能力。不過語義網概念實際上是基于很多現有技術的(某些技術甚至可以追溯到 20 世紀 60 年代末期),也依賴于后來和 text-and-markup 與知識表現的綜合。維基百科。
[2] Linked Data,即鏈接數據。在計算領域中,鏈接數據描述了一種發布結構化數據的方法,以便鏈接數據可以互聯進而變得更加有用。它建立在 HTTP 和 URI 等標準的 Web 技術之上,但不是使用它們來為人類讀者的網頁服務,而是它以一種可由計算機自動讀取的方式來為共享信息提供數據。這樣就可以連接和查詢來自不同源的數據。更多內容請參閱維基百科。
[3] RDF,即資源描述框架(Resource Description Framework),是萬維網聯盟(W3C)提出的一組標記語言的技術標準,以便更為豐富地描述和表達網絡資源的內容與結構。更多內容請參閱維基百科。
[4] RSS 1.0,即 RDF 網摘(RDF Site Summary)或簡易資訊聚合,是一種消息來源格式規范,用以發布經常更新資料的網站,例如 blog 文章、新聞、音訊或視訊的網摘。RSS 文件(或稱做摘要、網絡摘要、或頻道)包含了全文或是節錄的文字,還有發布日期和作者身份等元數據。更多內容請參閱維基百科。
[5] JSON-LD ,即JavaScript Object Notation for Linked Data,是一種使用 JSON 來傳輸鏈接數據的方法,它旨在使用得到廣泛支持的 JSON 序列化格式來存儲和傳輸鏈接數據。更多內容請參閱維基百科。
[6] 等冪(idempotent),指同一消息(函數)可重復執行兩次或多次,而執行結果保持不變的性質。
[7] RMI(Remote Method Invocation),即遠程方法調用,更多內容請參閱維基百科。
[8] JSON DTO(JSON Data Transfer Object),即 JSON 數據傳輸對象。