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

我正在尝试使用play.api.libs.ws.WS执行post,但我无法弄清楚如何设置params,我的代码:

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

.post需要(T body,play.api.http.Writeable wrt,play.api.http.ContentTypeOf ct)但是我不明白我应该如何通过那里的params。 文档仅说明:

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

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

尝试构建这样的请求:

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

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

嗯,我想我应该开始看import!

我不小心使用了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() { public Result apply(WS.Response response) { return ok(response.toString()); } } ) ); } 

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

 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 ,这通常是服务器想要的。

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

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

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

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

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

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

对我来说是最好的方式

 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

在游戏2.1中执行阻止请求的正确方法是

 WSRequestHolder wsreqHolder = WS.url(""); wsreqHolder.setQueryParameter("id", "100"); F.Promise promiseOfResult = wsreqHolder.get(); WS.Response response = promiseOfResult.get(); //block here String jsonData = response.getBody(); return ok("Client:"+jsonData); 

我试过了。 有用