6

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呼び出しをコメントアウトしてみましたが、例外はスローされませんでしたが、当然、正しい結果は得られませんでした。

私は何か間違ったことをしていますか?私は何を間違っていますか、なぜですか? どうすれば問題を解決できますか?

前にありがとう。

4

2 に答える 2

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

また、Play のメジャー アップグレードごとにコードを再検討するようにメモを作成しました! これは明らかに正しくないため、上記が修正されるかどうかを確認します。

于 2012-06-23T17:54:37.273 に答える
1

Play フレームワーク ツールを使用してユーザーのトークンとシークレットを取得したら、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)

2 つのライブラリを使用しなければならないのは面倒です。twitter4j は非同期ではないため、リソース効率はわずかに低下しますが、必要に応じて実際の投稿を行うことができます。

于 2013-04-11T18:46:23.680 に答える