在我们的项目中,我们使用JSON进行前端和后端之间的数据传输。 基本上我们通过准备WSRequestHolder来创建请求,就像播放文档告诉(https://www.playframework.com/documentation/2.3.7/JavaWS) 然后发布一个json字符串。 然后将WSResponse映射为“asJson”作为Promise返回。
但与WSResponse不同,JsonNode不包含从后端返回的http状态,Promise也不包含。
我们需要在代码中区分不同的状态代码,以便进行正确的响应处理。
到目前为止,我们得到了一个工厂类,它提供了准备好的对象,其中WSRequestHolder保存了url,header和content type,用于发布json数据。此外,我们在工厂实施了“post”,如下所示:
/**
* Posts the given json body to the specified url
*
* @param body Body of JSON node to post
* @return Promised response from post call
*/
@Override
public F.Promise<JsonNode> post(JsonNode body) {
try {
return wsRequestHolder.post(body).map(WSResponse::asJson).recover(new F.Function<Throwable, JsonNode>() {
// if null response is returned, recover it and return 'java' null properly
@Override
public JsonNode apply(Throwable throwable) throws Throwable {
return null;
}
});
} catch (RuntimeException e) {
return null;
}
}
在控制器中,可以解包返回的promise,以便以JsonNode的形式检索实际的json响应。
F.Promise<JsonNode> jsonPromise = Factory.preparedJson(url).post(someJsonNode);
JsonNode jsonResponse = jsonPromise.get(responseTimeoutInMs);
但是 - 在控制器级别之间的某处,我需要检查状态代码。
提前多多感谢!
Greets,Tim
答案 0 :(得分:1)
您可以检查WSResponse对象的状态响应,并将其与JsonNode一起返回到promise中。这是一个简单的例子:
Promise<Pair<JsonNode,Integer>> jsonPromise = WS.url(url).get().map(
new Function<WSResponse, Pair<JsonNode,Integer>>() {
public Pair<JsonNode,Integer> apply(WSResponse response) {
Integer status=response.getStatus();
JsonNode json = response.asJson();
return new Pair(json,status);
}
}
);