Documentation

You are viewing the documentation for the 2.3.x release series. The latest stable release series is 3.0.x.

§Body parsers

§What is a body parser?

An HTTP request (at least for those using the POST and PUT operations) contains a body. This body can be formatted with any format specified in the Content-Type header. A body parser transforms this request body into a Java value.

Note: You can’t write BodyParser implementation directly using Java. Because a Play BodyParser must handle the body content incrementally using an Iteratee[Array[Byte], A] it must be implemented in Scala.

However Play provides default BodyParsers that should fit most use cases (parsing Json, Xml, Text, uploading files). And you can reuse these default parsers to create your own directly in Java; for example you can provide an RDF parser based on the Text one.

§The BodyParser Java API

When working with request bodies, ensure that you have the following imports in your controller:

import play.mvc.*;
import play.mvc.Http.*;

In the Java API, all body parsers must generate a play.mvc.Http.RequestBody value which can be retrieved via request().body():

public static Result index() {
    RequestBody body = request().body();
    return ok("Got body: " + body);
}

You can specify the BodyParser to use for a particular action using the @BodyParser.Of annotation:

@BodyParser.Of(BodyParser.Json.class)
public static Result index() {
    RequestBody body = request().body();
    return ok("Got json: " + body.asJson());
}

§The Http.RequestBody API

As we just said all body parsers in the Java API will give you a play.mvc.Http.RequestBody value. From this body object you can retrieve the request body content in the most appropriate Java type.

Note: The RequestBody methods like asText() or asJson() will return null if the parser used to compute this request body doesn’t support this content type. For example in an action method annotated with @BodyParser.Of(BodyParser.Json.class), calling asXml() on the generated body will return null.

§Default body parser: AnyContent

If you don’t specify your own body parser, Play will use the default one guessing the most appropriate content type from the Content-Type header:

For example:

public static Result save() {
    RequestBody body = request().body();
    String textBody = body.asText();

    if(textBody != null) {
        return ok("Got: " + textBody);
    } else {
        return badRequest("Expecting text/plain request body");
    }
}

§Max content length

Text based body parsers (such as text, json, xml or formUrlEncoded) use a max content length because they have to load all the content into memory.

There is a default maximum content length of 100KB. It can be overridden by specifying the parsers.text.maxLength property in application.conf:

parsers.text.maxLength=128K

You can also specify a maximum content length via the @BodyParser.Of annotation:

// Accept only 10KB of data.
@BodyParser.Of(value = BodyParser.Text.class, maxLength = 10 * 1024)
public static Result index() {
    if(request().body().isMaxSizeExceeded()) {
        return badRequest("Too much data!");
    } else {
        return ok("Got body: " + request().body().asText());
    }
}

Next: Actions composition


Found an error in this documentation? The source code for this page can be found here. After reading the documentation guidelines, please feel free to contribute a pull request. Have questions or advice to share? Go to our community forums to start a conversation with the community.