如何在Play 2.1 Java中为WS.post()设置params

时间:2013-02-18 13:40:46

标签: java playframework-2.1

我正在尝试使用play.api.libs.ws.WS执行帖子,但我无法理解 如何设置params,我的代码:

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 = foo param2 = bar

7 个答案:

答案 0 :(得分:10)

尝试构建这样的请求:

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

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

答案 1 :(得分:5)

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

我不小心使用了导入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());
                    }
                }
            )
        );
    }

答案 2 :(得分:4)

接受的答案是错误的,或者至少是误导性的。代码

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

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

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

表单 param1=foo&param2=bar发布到网址http://localhost:9001,这通常是服务器所需的内容。

答案 3 :(得分:1)

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

此方法使用HTTP POST方法发送其表单请求。从Play的官方文档中可以看出,您应该已经了解了GET方法。

这种方式是使用交方式提交表单请求,见于游戏的官方文档,获取方式的你应该已经知道了。

答案 4 :(得分:1)

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

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

该序列采用任意数量的JsValues,它们也可以嵌套JsObjects。

答案 5 :(得分: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

答案 6 :(得分:-2)

在游戏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);

我试过了。它的工作原理