快速业务通道

面向Java开发人员的Scala指南 - 用Scitter更新Twitter - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
(method)     (method.getStatusLine().getStatusCode(),  method.getResponseBodyAsString())    }

面向Java开发人员的Scala指南 - 用Scitter更新Twitter(3)

时间:2010-12-04 IBM Ted Neward

execute() 方法最大的变化是引入了 Map[String,String] 参数,以及与它 的大小有关的 “if” 测试。该测试决定是处理 GET 请求还是 POST 请求。由 于 Apache Commons HttpClient 要求 POST 请求的主体放在 NameValuePairs 中,因此我们使用 foreach() 调用遍历 map 的元素。我们以二元组 pr 的形式 传入 map 的键和值,并将它们分别提取到本地绑定变量 k 和 v,然后使用这些 值作为 NameValuePair 构造函数的构造函数参数。

我们还可以使用 PostMethod 上的 setParameter(name, value) API 更轻松 地做这些事情。出于教学的目的,我选择了清单 3 中的方法:以表明 Scala 数 组和 Java 数组一样,仍然是可变的,即使数组引用被标记为 val 仍是如此。 记住,在实际代码中,对于每个 (k,v) 元组,使用 PostMethod 上的 setParameter(name, value) 方法要好得多。

还需注意,对于 if/else 返回的 “method” 对象的类型,Scala 编译器会 进行 does the right thing 类型推断。由于 Scala 可以看到 if/else 返回的 是 GetMethod 还是 PostMethod 对象,它会选择最接近的基本类型 HttpMethodBase 作为 “method” 的返回类型。这也意味着,在 execute() 方 法的其余部分中,HttpMethodBase 中的任何不可用方法都是不可访问的。幸运 的是,我们不需要它们,所以至少现在没有问题。

清单 3 中的实现的背后还潜藏着最后一个问题,这个问题是由这样一个事实 引起的:我选择了使用 Map 来区分 execute() 方法是处理 GET 操作,还是处 理 POST 操作。如果还需要使用其他 HTTP 动作(例如 PUT 或 DELETE),那么 将不得不再次重构 execute()。到目前为止,还没有这样的问题,但是今后要记 住这一点。

测试

在实施这样的重构之前,先运行 ant test,以确保原有的所有基于 GET 的 请求 API 仍可使用 — 事实确实如此。(这里假设生产 Twitter API 或 Twitter 服务器的可用性没有变化)。一切正常(至少在我的计算机上是这样) ,所以实现新的 execute() 方法就非常容易:

清单 4. Scitter v0.3: endSession

def endSession :  Boolean =    {     val (statusCode, statusBody) =      Scitter.execute ("http://twitter.com/account/end_session.xml",       Map("" -> ""), username, password)     statusCode == 200    }

这实在是再简单不过了。

接下来要做的是实现 rate_limit_status API,它有两个版本,一个是经过 验证的版本,另一个是没有经过验证的版本。我们将该方法实现为 Scitter 对 象和 Scitter 类上的 rateLimitStatus,如清单 5 所示:

清单 5. Scitter v0.3: rateLimitStatus

package  com.tedneward.scitter {   object Scitter   {    // ...    def rateLimitStatus : Option[RateLimits] =    {     val url =  "http://twitter.com/account/rate_limit_status.xml"      val (statusCode, statusBody) =      Scitter.execute(url)     if (statusCode == 200)     {      Some(RateLimits.fromXml(XML.loadString(statusBody)))     }     else     {      None     }    }   }   class Scitter   {    // ...    def rateLimitStatus : Option[RateLimits] =    {

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号