使用Play Framework 2.0将POST请求发送到Twitter API

ber*_*zie 6 scala playframework-2.0

如何使用Play Framework 2.0(使用Scala)向Twitter API发送POST请求?我正在尝试使用GET和POST调用的API,并且我已使用此代码使用GET成功调用它:

val followersURL = "http://api.twitter.com/1/users/lookup.json?user_id=" + listOfFollowers.mkString(",")            
WS.url(followersURL)
  .sign(OAuthCalculator(Twitter.KEY, tokens))
  .get()
  .map{ response => 
      val screenName: Seq[String] = response.json match {
          case res: JsArray => res.value.map{ value => (value \ "name").toString }
          case _ => Seq("")
      }
  }
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用POST调用API,如下所示:

WS.url("http://api.twitter.com/1/users/lookup.json")
  .sign(OAuthCalculator(Twitter.KEY, tokens))
  .post(Map("user_id"->listOfFollowers))
  .map { response => 
      val screenName: Seq[String] = response.json match {
          case res: JsArray => res.value.map{ value => (value \ "name").toString }
          case _ => Seq("")
      }
  }
Run Code Online (Sandbox Code Playgroud)

它没有用,我得到了这个例外:

[error] play - Waiting for a promise, but got an error: null
java.lang.NullPointerException: null
        at java.io.Reader.<init>(Unknown Source) ~[na:1.7.0_01]
        at java.io.InputStreamReader.<init>(Unknown Source) ~[na:1.7.0_01]
        at oauth.signpost.OAuth.decodeForm(OAuth.java:157) ~[signpost-core.jar:na]
        at oauth.signpost.AbstractOAuthConsumer.collectBodyParameters(AbstractOAuthConsumer.java:236) ~[signpost-core.jar:na]
        at oauth.signpost.AbstractOAuthConsumer.sign(AbstractOAuthConsumer.java:96) ~[signpost-core.jar:na]
        at play.api.libs.oauth.OAuthCalculator.sign(OAuth.scala:106) ~[play_2.9.1.jar:2.0.1]
Run Code Online (Sandbox Code Playgroud)

因为它说在OAuthCalculator上发生了异常,所以我试着注释掉这个.sign调用,它没有抛出任何异常,但当然我没有得到正确的结果.

难道我做错了什么?我做错了什么,为什么?我怎么能解决这个问题?

谢谢你.

opy*_*ate 4

我发现这个可行:

WS.url("http://api.twitter.com/1/users/lookup.json?user_id="+listOfFollowers)
  .sign(OAuthCalculator(Twitter.KEY, tokens))
  .post("ignored")
  .map { response => 
      val screenName: Seq[String] = response.json match {
          case res: JsArray => res.value.map{ value => (value \ "name").toString }
          case _ => Seq("")
      }
  }
Run Code Online (Sandbox Code Playgroud)

我还做了笔记,以便在 Play 的每次重大升级时重新审视我的代码!检查上面的问题是否得到解决,因为这显然是不对的。