2015-06-08 19 views
0

在我们的项目中,我们使用JSON在前端和后端之间进行数据传输。 基本上我们通过准备WSRequestHolder来创建请求,就像play doc告诉(https://www.playframework.com/documentation/2.3.7/JavaWS) 然后发布json字符串一样。 然后将WSResponse映射为“asJson”作为Promise返回。从Promise <JsonNode>检索HTTP状态Play 2.3.7

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

我们需要在代码中区分不同的状态代码以进行正确的响应处理。

到目前为止,我们得到了一个工厂类,它提供准备好的对象,其中一个WSRequestHolder通过url,header和content type set来保存,以发布json数据。再者,我们实施了工厂这样的“后”:

/** 
* 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; 
    } 
} 

在控制器则返回的承诺可以解开来检索实际的JSON响应为JsonNode。

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

JsonNode jsonResponse = jsonPromise.get(responseTimeoutInMs); 

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

非常感谢!

映入眼帘,蒂姆

回答

1

您可以检查从WSResponse对象的状态响应,并与JsonNode沿着承诺归还。这是一个简单的例子:

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); 
      } 
     } 
); 
+0

Thx!我会尽快检查出来。 – Timmay

+0

似乎工作正常。谢谢! – Timmay