10

I'm trying to perform a post with play.api.libs.ws.WS but I can't figure out how to set the params, my code:

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

.post takes (T body, play.api.http.Writeable wrt, play.api.http.ContentTypeOf ct) but I don't understand how I should pass the params there. The documentation only states:

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

How do I set the content eg. param1=foo and param2=bar?

4

7 に答える 7

11

次のようにリクエストを作成してみてください。

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

このメソッドは、への連鎖呼び出しを使用して元の要求を変更するために使用できる参照をurl(java.lang.String url)返します。WS.WSRequestHoldersetQueryParameter

于 2013-02-18T13:53:46.300 に答える
5

うーん、私は本当にインポートを見始める必要があると思います!

import play.api.libs.ws.WS の代わりに誤って import play.api.libs.ws.WS を使用してしまいました。play.libs.WSを使用すると、post(String string) や setContentType(String string) などのすべてのメソッドが明らかになりました。これが私がやった方法です:

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());
                    }
                }
            )
        );
    }
于 2013-02-18T14:02:31.627 に答える
4

受け入れられた答えは間違っているか、少なくとも誤解を招きます。コード

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

contentこれは、OPが望んhttp://localhost:9001/?param1=foo&param2=barでいたものではないことはほぼ確実です。うまくいく可能性がはるかに高いのは

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

フォーム param1=foo&param2=barを URL に投稿しますhttp://localhost:9001。これは通常、サーバーが必要とするものです。

于 2016-04-12T20:26:37.693 に答える
1

You need to pass in something that can be converted to serialized JSON. This works for me:

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

The sequence takes any number of JsValues which can also be nested JsObjects.

于 2016-02-01T06:15:50.820 に答える
0

私にとって最善の方法

WS.url("http://localhost:9001")
.post(Json.toJson(ImmutableMap.of("param1", "foo", "param2", "bar")));

http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/ImmutableMap.htmlからのマップ

http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained

于 2014-07-29T14:51:45.900 に答える
-2

Play 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);

私はそれを試しました。できます

于 2013-03-18T19:37:43.027 に答える