首页 文章

从Play 2.3.7上的Promise <JsonNode>中检索HTTP状态

提问于
浏览
0

在我们的项目中,我们使用JSON进行前端和后端之间的数据传输 . 基本上我们通过准备WSRequestHolder来创建请求,就像播放文档告诉(https://www.playframework.com/documentation/2.3.7/JavaWS)然后发布json字符串一样 . 然后将WSResponse映射"asJson"作为Promise返回 .

但与WSResponse不同,JsonNode不包含从后端返回的http状态,Promise也不包含 .

我们需要在代码中区分不同的状态代码,以便进行适当的响应处理 .

到目前为止,我们有一个工厂类,它提供准备好的对象,其中WSRequestHolder与url,header和content type set保持一致,以发布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以将实际的json响应检索为JsonNode .

F.Promise<JsonNode> jsonPromise = Factory.preparedJson(url).post(someJsonNode);

JsonNode jsonResponse = jsonPromise.get(responseTimeoutInMs);

但是 - 在控制器级别之间的某处,我需要检查状态代码 .

非常感谢提前!

招呼,蒂姆

1 回答

  • 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);
                }
            }
    );
    

相关问题