快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
 == 200    }   } }

好吧,我失言了。也不是那么容易。

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

时间:2010-12-04 IBM Ted Neward

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号