2013-02-18 7 views
9

Sto tentando di eseguire un post con play.api.libs.ws.WS ma non riesco a capire come impostare i parametri, il mio codice:Come impostare i parametri per WS.post() in riproduzione 2.1 Java

Promise<Response> promise = WS.url(Play.application().configuration() 
       .getString("sms.service.url")).post(); 

.post prende (corpo T, wRT play.api.http.Writeable, play.api.http.ContentTypeOf ct) , ma non capisco come dovrei passare i params Là. La documentazione afferma soltanto:

Promise<WS.Response> result = WS.url("http://localhost:9001").post("content"); 

Come faccio a impostare il contenuto per esempio. param1 = foo e param2 = bar?

+0

possibile duplicato di [Come impostare le intestazioni per WS.post() in riproduzione 2.1 Java] (http://stackoverflow.com/questions/14937159/how-do-i-set-headers-for-ws- post-in-play-2-1-java) – seh

risposta

10

provare a costruire la richiesta in questo modo:

WS.url("http://localhost:9001") 
    .setQueryParameter("param1", "foo") 
    .setQueryParameter("param2", "bar") 
    .post("content"); 

Il metodo restituisce un riferimento url(java.lang.String url)WS.WSRequestHolder che può essere usato per modificare la richiesta originale utilizzando chiamate incatenato ad setQueryParameter.

+7

Penso che la sua domanda, quella che ho anche io, è ciò che è "contenuto"? nel mio caso non c'è contenuto, e il metodo post(), senza parametro, non esiste – nightograph

+0

L'ho provato con '.post (" ")' e ha funzionato bene. Dovrò eseguirlo con Wireshark, più tardi, per capire esattamente cosa fa con questo "contenuto". È più facile che leggere il codice, almeno per me. – tavlima

+0

cosa è contenuto? – Draconar

5

Hmm Immagino che dovrei davvero iniziare a guardare le importazioni!

Ho usato per errore import play.api.libs.ws.WS invece di importare play.libs.WS; Quando si utilizza play.libs.WS, si sono rivelati tutti i metodi come post (stringa stringa) e setContentType (stringa stringa). Ecco come ho fatto:

import play.Play; 
import play.libs.F; 
import play.libs.WS; 

public static Result wsAction() { 
    return async(
     play.libs.WS.url(Play.application().configuration() 
      .getString("sms.service.url")) 
      .setContentType("application/x-www-form-urlencoded; charset=utf-8")      
      .post("param1=foo&param2=bar").map(
       new F.Function<WS.Response, Result>() { 
        public Result apply(WS.Response response) { 
         return ok(response.toString()); 
        } 
       } 
      ) 
     ); 
    } 
+0

Penso che ci possa essere qualcosa di sbagliato con il tuo setup 'sms.service.url', per accettare questa richiesta come POST, dal momento che questa stringa passata al post (' param1 = foo & param2 = bar') probabilmente non è stata correttamente/rigorosamente formattata come un carico utile POST. – tavlima

-1

Il modo giusto di fare la richiesta di blocco in gioco 2.1 è

WSRequestHolder wsreqHolder = WS.url("<SOME URL WHICH TAKES PARAMETER>"); 
wsreqHolder.setQueryParameter("id", "100"); 
F.Promise<WS.Response> promiseOfResult = wsreqHolder.get(); 

WS.Response response = promiseOfResult.get(); //block here 

String jsonData = response.getBody(); 
return ok("Client:"+jsonData); 

ho provato. Funziona

+0

la domanda riguarda specificamente post(), non get(). post richiede un parametro, get no. – nostromo

1
WS.url(url) 
.setContentType("application/x-www-form-urlencoded") 
.post("param1=foo&param2=bar"); 

Questo metodo utilizza un metodo HTTP POST per inviare la sua richiesta di modulo. Come visto dalla documentazione ufficiale di Play, dovresti aver già conosciuto il metodo GET.

这种 方式 是 使用 postale 方式 提交 表单 请求, 见于 giocare 的 官方 文档, ottenere 方式 的 你 应该 已经 知道 了.

+6

Sarebbe utile se si sostituisce al di sopra del cinese con qualche inglese comunemente usato. –

1

È necessario passare a qualcosa che può essere convertito in JSON serializzato. Questo funziona per me:

WS.url("https://www.someurl.com") 
    .post(JsObject(Seq("theString" -> JsString(someString)))) 

La sequenza prende un numero qualsiasi di JsValues ​​che possono anche essere annidate JSObject.

4

La risposta accettata è errata o almeno fuorviante. Il codice

WS.url("http://localhost:9001") 
    .setQueryParameter("param1", "foo") 
    .setQueryParameter("param2", "bar") 
    .post("content"); 

sarà inviare la stringa content-http://localhost:9001/?param1=foo&param2=bar, che non è quasi certamente quello che il PO voleva.Ciò che è molto più probabile che il lavoro è

WS.url("http://localhost:9001") 
    .post(Map("param1" -> Seq("foo"), 
      "param2" -> Seq("bar"))) 

che i messaggi del moduloparam1=foo&param2=bar per l'URL http://localhost:9001, che in genere è quello che il server vuole.

+0

@flurdy - yikes, frecce sottili, sì. Scusate! – Malvolio

Problemi correlati