如何在play应用程序中从play.mvc.Result对象中提取结果内容?

如何在play应用程序中从play.mvc.Result对象中提取结果内容?

问题描述:

实际上我正在从一个play应用程序重定向到另一个play应用程序,最后我收到响应作为Result对象..下面是两个应用程序中的操作。我正在从apllication1重定向到application2。应用程序2将返回JSON字符串,我需要提取。如何在play应用程序中从play.mvc.Result对象中提取结果内容?

如何从Result对象中检索JSON内容?

应用1:

public static Result redirectTest(){ 

    Result result = redirect("http://ipaddress:9000/authenticate"); 
    /*** here I would like to extract JSON string from result***/ 
    return result; 
} 

应用2:

@SecuredAction 
public static Result index() { 
    Map<String, String> response = new HashMap<String, String>(); 
    DemoUser user = (DemoUser) ctx().args.get(SecureSocial.USER_KEY); 

     for(BasicProfile basicProfile: user.identities){ 
      response.put("name", basicProfile.firstName().get()); 
      response.put("emailId", basicProfile.email().get()); 
      response.put("providerId", basicProfile.providerId()); 
      response.put("avatarurl", basicProfile.avatarUrl().get()); 
     } 

    return ok(new JSONObject(response).toString()); 
} 

使用JavaResultExtractor,例如:

Result result = ...; 
byte[] body = JavaResultExtractor.getBody(result, 0L); 

有一个字节数组,你可以从内容 - 提取字符集类型头,并创建java.lang.String中:

String header = JavaResultExtractor.getHeaders(result).get("Content-Type"); 
String charset = "utf-8"; 
if(header != null && header.contains("; charset=")){ 
    charset = header.substring(header.indexOf("; charset=") + 10, header.length()).trim(); 
} 
String bodyStr = new String(body, charset); 
JsonNode bodyJson = Json.parse(bodyStr); 

一些上面的代码是从play.test.Helpers

+0

JavaResultExtractor.getBody(结果,0L)给出超时即使我把它从0更改为100K – 2016-09-14 11:58:39

+0

想知道为什么不要使用play.test.Helpers.contentAsString(result)? – Fahad 2017-03-28 17:16:10

+0

助手类具有测试范围。 – 2017-03-28 20:56:02

复制在一个控制器的方法的上下文中可以尝试:

import play.libs.Json; 
import play.mvc.Result; 
import org.codehaus.jackson.JsonNode; 
import org.codehaus.jackson.node.ObjectNode; 
... 
public static Result redirectTest(){ 
    ObjectNode body = (ObjectNode) request().body().asJson(); 
    String providerId = body.get("providerId").asText(); 
} 

这SO问题可能也有帮助:JSON and Play

redirect返回错误代码为303的结果,这会导致调用方(浏览器)执行另一个请求到给定的网址。
你需要做的是实际的代理。 Application1应向Application2发出请求,并处理响应。
播放有非常好的Web Service API它可以很容易地做到这一点。

此功能工作正常,我..感谢蒙卡拉马里

public static JsonNode resultToJsonNode(Result result) { 

    byte[] body = JavaResultExtractor.getBody(result, 0L); 

    ObjectMapper om = new ObjectMapper(); 
    final ObjectReader reader = om.reader(); 
    JsonNode newNode = null; 
    try { 
     newNode = reader.readTree(new ByteArrayInputStream(body)); 
     Logger.info("Result Body in JsonNode:" + newNode.toString()); 
    } catch (JsonProcessingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return newNode; 
} 

}

+0

JavaResultExtractor.getBody正在给出超​​时错误,即使我将值从0增加到100k。 – 2016-09-14 11:22:40

首先,我写这篇文章的Scala方法来转换枚举[数组[字节]到未来[数组[字节] ]:

class EnumeratorHelper { 

    def getEnumeratorFuture(body: Enumerator[Array[Byte]]) ={ 
    Iteratee.flatten(body |>> Iteratee.consume[Array[Byte]]()).run 
    } 

} 

然后转换回到未来的承诺,最后得到承诺值:

final F.Promise<Result> finalResultPromise = delegate.call(ctx); 
finalResultPromise.onRedeem(result -> { 
    F.Promise<byte[]> requestBodyPromise = F.Promise.wrap(new EnumeratorHelper().getEnumeratorFuture(result.toScala().body())); 

    requestBodyPromise.onRedeem(bodyByte -> handleBody(new String(bodyByte, "UTF-8"))); 

}); 

你需要通过akka.stream.Materializer的实例为JavaResultExtractorgetbody方法。

使用Google Guice在构造函数级别或声明级别进行注入。

@Inject 
Materializer materializer; 

,并进一步可以转化成结果字符串或任何其他类型的要求:

Result result = getResult(); // calling some method returning result 
    ByteString body = JavaResultExtractor.getBody(result, 1, materializer); 
    String stringBody = body.utf8String(); // get body as String. 
    JsonNode jsonNodeBody = play.libs.Json.parse(stringBody); // get body as JsonNode. 
+0

经过一天半的搜索之后,这是* only *的地方,我发现这个解决方案用于在Play-2.5上下文中“创建”“Materializer”。这应该在从Play 2.4到Play 2.5的迁移指南中提到。 – 2018-01-04 11:00:51