简体   繁体   中英

Play 2.6: get response body in custom http action

A while ago, I asked how to get the body from a Result in Play 2.5.0 Java.

The answer was basically to use play.core.j.JavaResultExtractor . I am now upgrading to 2.6, and JavaResultExtractor no longer exists (or at least is not public).

How does one do this in Play 2.6?

I did find Result.body().consumeData which seems like it might work, but also comes with the worrisome warning:

This method should be used carefully, since if the source represents an ephemeral stream, then the entity may not be usable after this method is invoked.

I suppose that, since I am doing this in an action, I could call consumeData to get all of the data into a local variable, process that and then return a new result with the stored data. That only fails in the case where the data is too big to fit into memory, which is not something I am currently expecting.

In in Play 2.6 it is still possible to re-implement 2.5 functionality. Please have a look at the example that get Json body from Result:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM