WEB开发网
开发学院软件开发Java 面向 Java 开发人员的 Scala 指南: 用 Scitter 更... 阅读

面向 Java 开发人员的 Scala 指南: 用 Scitter 更新 Twitter

 2009-12-09 00:00:00 来源:WEB开发网   
核心提示: 好吧,我失言了,面向 Java 开发人员的 Scala 指南: 用 Scitter 更新 Twitter(3),也不是那么容易,POST和我们到目前为止用过的 Twitter API 中的其他 API 不一样,使之用 一个 Map 作为参数,如果 Map 为空,end_session 要求传入的

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

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()) 
 
  } 

上一页  1 2 3 4 5 6 7 8  下一页

Tags:面向 Java 开发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接