【问题标题】:Sending POST Request to Twitter API with Play Framework 2.0使用 Play Framework 2.0 向 Twitter API 发送 POST 请求
【发布时间】:2013-04-12 03:14:30
【问题描述】:

如何使用 Play Framework 2.0(使用 Scala)向 twitter API 发送 POST 请求?我尝试调用的 API 可以同时使用 GET 和 POST,并且我已经成功地使用 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("")
      }
  }

然后我尝试像这样使用 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("")
      }
  }

它不起作用,我得到了这个异常:

[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]

由于它说异常发生在 OAuthCalculator 上,我尝试注释掉 .sign 调用,它没有抛出任何异常,但当然我没有得到正确的结果。

我做错了吗?我做错了什么,为什么?我该如何解决这个问题?

之前谢谢。

【问题讨论】:

    标签: scala playframework-2.0


    【解决方案1】:

    我发现这是可行的:

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

    我还做了笔记,以便在 Play 的每次重大升级时重新访问我的代码!检查上述是否得到修复,因为这显然是不对的。

    【讨论】:

      【解决方案2】:

      一旦您使用 Play Framework 工具获取用户的令牌和密码,您就可以使用 twitter4j ("org.twitter4j" % "twitter4j-core" % "3.0.3") 库来进行这样的发布。

      import twitter4j.conf.ConfigurationBuilder
      import twitter4j.{StatusUpdate, TwitterFactory}
      
      val config = new ConfigurationBuilder()
        .setOAuthConsumerKey(twitterKey)
        .setOAuthConsumerSecret(twitterSecret)
        .setOAuthAccessToken(token)
        .setOAuthAccessTokenSecret(secret)
        .build()
      val twitter = new TwitterFactory(config).getInstance()
      val status = new StatusUpdate(tweet)
      status.media(photoName, stream)
      val twitResp = twitter.updateStatus(status)
      

      不得不使用两个库很烦人,而且 twitter4j 不是异步的,所以它的资源效率略低,但它可以让你做一些有时需要的真实帖子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-09
        • 2017-10-16
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多