抽象地討論 Scala 是一件有趣的事情,但對於本專欄的大多數讀者而言,需要通過實踐才能理解理論和應用之間的區別。在本期文章中,Ted Neward 將使用 Scala 為客戶構建基礎框架,用於訪問流行的微型博客系統 Twitter。
Twitter 迅速佔領了 Internet 市場。您肯定知道這個出色的社交網路工具允許訂閱者提供關於他們自身以及當前正在執行的任務的簡要狀態更新。追隨者將接收到他們的 “Twitter 提要” 的更新,這與博客將更新生成到博客閱讀者的提要中極為類似。
|
就其本身而言,Twitter 是對社交網路的有趣討論,並且是用戶之間的新一代 “高度互聯”,它具備您能想到的所有優點和缺點。
由於 Twitter 很早就發布了其 API,因此大量 Twitter 客戶機應用程序湧入到 Internet 上。由於該 API 主要建立在直觀和易於理解的基礎上,因此許多開發人員都發現有必要構建一個自己的 Twitter 客戶機,這與學習 Web 技術的開發人員構建自己的博客伺服器極為類似。
考慮到 Scala 的功能性(這看上去能很好地協同 Twitter 的 REST 式特性)以及非常出眾的 XML 處理特性,因此嘗試構建一個用於訪問 Twitter 的 Scala 客戶機庫應該是一個非常不錯的體驗。
何為 Twitter?
在詳細討論之前,我們先來看看 Twitter API。
簡單來說,Twitter 是一個 “微型博客” — 關於您自己的簡短個性化提要,不超過 140 個字元,任何 “追隨者” 都可以通過 Web 更新、RSS、文本消息等方式接收它們。(140 字元的限制完全來自文本消息,它是 Twitter 的主要來源渠道,並受到類似的限制)。
|
從實際的角度來說,Twitter 是一個最具 REST 特徵 的 API,您可以使用一些種類的消息格式 — XML、ATOM、RSS 或 JSON — 來發送或從 Twitter 伺服器接收消息。不同的 URL,與不同的消息和它們所需及可選的消息部分相結合,可以發起不同的 API 調用。例如,如果您希望接收 Twitter 上所有人的所有 “Tweets”(Twitter 更新)的完整列表(也稱作 “公共時間軸”),您需要準備一個 XML、ATOM、RSS 或 JSON 消息,將它發送給合適的 URL,並採用與 Twitter 網站(apiwiki.twitter.com)上相同的格式來使用結果:
------------------------------------------------------------
public_timeline
返回設定了自定義用戶圖標的
非保護用戶的 20 條最新狀態。不需要身份驗證。
注意,公共時間軸將緩存 60 秒鐘
因此頻繁請求它不再浪費資源。
URL: http://twitter.com/statuses/public_timeline.format
格式:xml、json、rss、atom
方法:GET
API 限制:不適用
返回:狀態元素列表
------------------------------------------------------------
從編程的角度來說,這意味著我們給 Twitter 伺服器發送一個簡單的 GET HTTP 請求,並且我們將獲取一組封裝在 XML、RSS、ATOM 或 JSON 消息中的 “狀態” 消息。Twitter 站點將 “狀態” 消息定義為類似清單 1 所示的內容:
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom"> <title>Twitter / tedneward</title> <id>tag:twitter.com,2007:Status</id> <link type="text/html" rel="alternate" href="http://twitter.com/tedneward"/> <updated>2009-03-07T13:48:31+00:00</updated> <subtitle>Twitter updates from Ted Neward / tedneward.</subtitle> <entry> <title>tedneward: @kdellison Happens to the best of us...</title> <content type="html">tedneward: @kdellison Happens to the best of us...</content> <id>tag:twitter.com,2007:http://twitter.com/tedneward/statuses/1292396349</id> <published>2009-03-07T11:07:18+00:00</published> <updated>2009-03-07T11:07:18+00:00</updated> <link type="text/html" rel="alternate" href="http://twitter.com/tedneward/statuses/1292396349"/> <link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/ 55857457/javapolis_normal.png"/> <author> <name>Ted Neward</name> <uri>http://www.tedneward.com</uri> </author> </entry> </feed> |
狀態消息中的大部分元素(如果不是全部的話)都很直觀,因此不再贅述。
由於我們可以採用三種基於 XML 的格式使用 Twitter 消息,以及 Scala 具備一些非常強大的 XML 特性,包括 XML 字面值和類似 XPath 的查詢語法 API,因此編寫可以發送和接收 Twitter 消息的 Scala 庫只需要一些基礎的 Scala 編碼工作。舉例來說,通過 Scala 使用清單 1 消息來提取狀態更新的標題或內容可以利用 Scala 的 XML 類型和 \ 及 \\ 方法,如清單 2 所示:
<![CDATA[ package com.tedneward.scitter.test { class ScitterTest { import org.junit._, Assert._ @Test def simpleAtomParse = { val atom = <feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom"> <title>Twitter / tedneward</title> <id>tag:twitter.com,2007:Status</id> <link type="text/html" rel="alternate" href="http://twitter.com/tedneward"/> <updated>2009-03-07T13:48:31+00:00</updated> <subtitle>Twitter updates from Ted Neward / tedneward.</subtitle> <entry> <title>tedneward: @kdellison Happens to the best of us...</title> <content type="html">tedneward: @kdellison Happens to the best of us...</content> <id>tag:twitter.com,2007: http://twitter.com/tedneward/statuses/1292396349</id> <published>2009-03-07T11:07:18+00:00</published> <updated>2009-03-07T11:07:18+00:00</updated> <link type="text/html" rel="alternate" href="http://twitter.com/tedneward/statuses/1292396349"/> <link type="image/png" rel="image" href="http://s3.amazonaws.com/twitter_production/profile_images/ 55857457/javapolis_normal.png"/> <author> <name>Ted Neward</name> <uri>http://www.tedneward.com</uri> </author> </entry> </feed> assertEquals(atom \\ "entry" \ "title", "tedneward: @kdellison Happens to the best of us...") } } } ]]> |
有關 Scala 的 XML 支持的更多詳細信息,請參閱 “Scala 和 XML”(參見 參考資料)。
實際上,使用原始 XML 本身並不是一個有趣的練習。如果 Scala 的宗旨是讓我們的生活更加輕鬆,那麼可以創建一個或一組專用於簡化 Scala 消息發送和接收任務的類。作為其中一個目標,應該能夠在 “普通” Java 程序中方便地使用庫(這意味著可以方便地從任何可理解普通 Java 語義的環境中來訪問它,比如說 Groovy 或 Clojure)。
API 設計
在深入了解 Scala/Twitter 庫的 API 設計之前(根據同事 ThoughtWorker Neal Ford 的建議,我將它稱作 “Scitter”),需要明確一些需求。
首先,Scitter 顯然會對網路訪問有一些依賴 — 並且可擴展到 Twitter 伺服器 — 這會使測試變得非常困難。
其次,我們需要解析(和測試)Twitter 發回的各種格式。
[火星人 ] 通過 Scala 可以實現更好的社交網路已經有489次圍觀