播放2.6:在自定义http操作中获取响应正文

时间:2018-02-26 23:04:48

标签: java http playframework playframework-2.6

前一段时间,我问how to get the body from a Result in Play 2.5.0 Java.

答案基本上是使用play.core.j.JavaResultExtractor。我现在升级到2.6,JavaResultExtractor不再存在(或者至少不公开)。

如何在Play 2.6中执行此操作?

我确实找到Result.body().consumeData似乎可能有用,但也附带了令人担忧的警告:

  

应谨慎使用此方法,因为如果源表示短暂流,则在调用此方法后实体可能无法使用。

我想,由于我在一个动作中这样做,我可以调用consumeData将所有数据放入一个局部变量,然后处理它然后用存储的数据返回一个新结果。只有在数据太大而无法容纳到内存的情况下才会失败,这不是我目前所期待的。

1 个答案:

答案 0 :(得分:2)

在Play 2.6中,仍然可以重新实现2.5功能。请查看从Result获取Json正文的示例:

public static JsonNode resultToJsonNode(final Result result, final long timeout, final Materializer mat)
    throws Exception {
    FiniteDuration finiteDuration = Duration.create(timeout, TimeUnit.MILLISECONDS);
    byte[] body = Await.result(
        FutureConverters.toScala(result.body().consumeData(mat)), finiteDuration).toArray();
    ObjectMapper om = new ObjectMapper();
    final ObjectReader reader = om.reader();

    return reader.readTree(new ByteArrayInputStream(body));
}