2012-06-23 15 views
6

Come si invia una richiesta POST all'API di Twitter utilizzando Play Framework 2.0 (con Scala)? L'API Sto cercando di chiamare lavoro sia con GET e POST, e ho chiamato con successo utilizzando GET con questo codice:Invio richiesta POST all'API di Twitter con Play Framework 2.0

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

Poi ho provato a chiamare l'API utilizzando post come questo:

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

non ha funzionato e ottengo questa eccezione:

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

Poiché si dice che l'eccezione si verifica sul OAuthCalculator, cerco di commentare la chiamata .sign, e non gettare alcun eccezione, ma ovviamente non ho ottenuto il risultato giusto.

Sto facendo qualcosa di sbagliato? Cosa sto sbagliando e perché? Come posso risolvere il problema?

Grazie prima.

risposta

4

Ho trovato questo al lavoro:

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

Ho anche fatto le note di rivisitare il mio codice di ogni importante aggiornamento del Play! per verificare se quanto sopra viene corretto, perché ovviamente non è corretto.

+0

Questo risolve il mio problema. Grazie! – bertzzie

1

Dopo aver utilizzato gli strumenti di Play Framework per ottenere il token e il segreto dell'utente, è possibile utilizzare la libreria twitter4j ("org.twitter4j" % "twitter4j-core" % "3.0.3") per pubblicare i post in questo modo.

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) 

fastidioso dover utilizzare due biblioteche, e twitter4j non è asincrona quindi è un po 'meno efficiente nell'impiego delle risorse, ma permette di fare i messaggi reali che sono necessari a volte.

Problemi correlati