10

我正在尝试使用 play.api.libs.ws.WS 发布帖子,但我不知道如何设置参数,我的代码:

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

.post需要 (T body, play.api.http.Writeable wrt, play.api.http.ContentTypeOf ct) 但我不明白我应该如何在那里传递参数。该文档仅说明:

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

我如何设置内容,例如。param1=fooparam2=bar

4

7 回答 7

11

尝试像这样构造请求:

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

该方法url(java.lang.String url)返回一个WS.WSRequestHolder引用,该引用可用于使用对 的链式调用来修改原始请求setQueryParameter

于 2013-02-18T13:53:46.300 回答
5

嗯,我想我真的应该开始看进口了!

我不小心使用了 import play.api.libs.ws.WS 而不是 import play.libs.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");

会将字符串发布contenthttp://localhost:9001/?param1=foo&param2=bar,这几乎肯定不是 OP 想要的。更有可能起作用的是

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
WS.url(url)
.setContentType("application/x-www-form-urlencoded")
.post("param1=foo&param2=bar");

此方法使用 HTTP POST 方法发送其表单请求。从 Play 的官方文档看,你应该已经知道 GET 方法了。

方式是使用post方式提交请求,见于play的官方文档,get方式的你应该已经知道了。</p>

于 2015-02-09T10:47:05.197 回答
1

您需要传入可以转换为序列化 JSON 的内容。这对我有用:

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

该序列采用任意数量的 JsValue,也可以是嵌套的 JsObject。

于 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 回答