面向 Java 开发人员的 Scala 指南: 用 Scitter 更新 Twitter
2009-12-09 00:00:00 来源:WEB开发网好吧,我失言了。也不是那么容易。
POST
和我们到目前为止用过的 Twitter API 中的其他 API 不一样,end_session 要求传入的消息是用 HTTP POST 语义发送的。现在,Scitter.execute 方法做任何事情都是通过 GET,这意味着需要将那些期望 GET 的 API 与那些期望 POST 的 API 区分开来。
现在暂不考虑这一点,另外还有一个明显的变化:POST 的 API 调用还需将名称/值对传递到 execute() 方法中。(记住,在其他 API 调用中,若使用 GET,则所有参数可以作为查询参数出现在 URL 行;若使用 POST,则参数出现在 HTTP 请求的主体中。)在 Scala 中,每当提到名称/值对,自然会想到 Scala Map 类型,所以在考虑建模作为 POST 一部分发送的数据元素时,最容易的方法是将它们放入到一个 Map[String,String] 中并传递。
例如,如果将一个新的状态消息传递给 Twitter,需要将这个不超过 140 个字符的消息放在一个名称/值对 status 中,那么应该如清单 2 所示:
清单 2. 基本 map 语法val map = Map("status" -> message)
在此情况下,我们可以重构 Scitter.execute() 方法,使之用 一个 Map 作为参数。如果 Map 为空,那么可以认为应该使用 GET 而不是 POST,如清单 3 所示:
清单 3. 重构 execute() private[scitter] def execute(url : String) : (Int, String) =
execute(url, Map(), "", "")
private[scitter] def execute(url : String, username : String,
password : String) : (Int, String) =
execute(url, Map(), username, password)
private[scitter] def execute(url : String,
dataMap : Map[String,String]) : (Int, String) =
execute(url, dataMap, "", "")
private[scitter] def execute(url : String, dataMap : Map[String,String],
username : String, password : String) =
{
val client = new HttpClient()
val method =
if (dataMap.size == 0)
{
new GetMethod(url)
}
else
{
var m = new PostMethod(url)
val array = new Array[NameValuePair](dataMap.size)
var pos = 0
dataMap.elements.foreach { (pr) =>
pr match {
case (k, v) => array(pos) = new NameValuePair(k, v)
}
pos += 1
}
m.setRequestBody(array)
m
}
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, false))
if ((username != "") && (password != ""))
{
client.getParams().setAuthenticationPreemptive(true)
client.getState().setCredentials(
new AuthScope("twitter.com", 80, AuthScope.ANY_REALM),
new UsernamePasswordCredentials(username, password))
}
client.executeMethod(method)
(method.getStatusLine().getStatusCode(), method.getResponseBodyAsString())
}
更多精彩
赞助商链接