-
Notifications
You must be signed in to change notification settings - Fork 0
JavaBodyParsers
An HTTP PUT or POST request contains a body. This body can use any format, specified in the Content-Type request header. In Play, a body parser transforms this request body into a Java value.
Note: You can't write a
BodyParserimplementation directly using Java. Because a PlayBodyParsermust handle the body content incrementally using anIteratee[Array[Byte], A], it must be implemented in Scala.However Play provides default
BodyParserimplementations that should fit most use cases (parsing JSON, XML, text, uploading files). You can reuse these default parsers to create your own directly in Java; for example you could provide an RDF parser based on the text parser.
In the Java API, all body parsers must generate a play.mvc.Http.RequestBody value. This value computed by the body parser can then be retrieved via request().body():
public static Result index() {
RequestBody body = request().body();
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();
ok("Got json: " + body.asJson());
}
As we said above, 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
RequestBodymethods, such asasText()orasJson(), will returnnullif 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), callingasXml()on the generated body will returnnull.
Some parsers can provide a most specific type than Http.RequestBody (i.e. a subclass of Http.RequestBody). You can automatically cast the request body into another type using the as(...) helper method:
@BodyParser.Of(BodyLengthParser.class)
public static Result index() {
BodyLength body = request().body().as(BodyLength.class);
ok("Request body length: " + body.getLength());
}
If you don't specify your own body parser, Play will use the default, guessing the most appropriate content type from the Content-Type header:
-
text/plain:
String, accessible viaasText() -
application/json:
JsonNode, accessible viaasJson() -
text/xml:
org.w3c.Document, accessible viaasXml() -
application/form-url-encoded:
Map<String, String[]>, accessible viaasFormUrlEncoded() -
multipart/form-data:
Http.MultipartFormData, accessible viaasMultipartFormData() - Any other content type:
Http.RawBuffer, accessible viaasRaw()
For example:
public static Result save() {
RequestBody body = request().body();
String textBody = body.asText();
if(textBody != null) {
ok("Got: " + text);
} else {
badRequest("Expecting text/plain request body");
}
}
Text based body parsers (such as text, json, xml or formUrlEncoded) have a maximum content length because they have to load all the content into memory.
There is a default content length (the default is 100 KB).
Tip: The default content size can be defined 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().isMaxSizeExcedeed()) {
return badRequest("Too much data!");
} else {
ok("Got body: " + request().body().asText());
}
}
Next: Action composition
- Actions, Controllers and Results
- HTTP routing
- Manipulating the HTTP response
- Session and Flash scopes
- Body parsers
- Actions composition
- Content negotiation
- HTTP programming
- Asynchronous HTTP programming
- The template engine
- HTTP form submission and validation
- Working with JSON
- Working with XML
- Handling file upload
- Accessing an SQL database
- Using the Cache
- Calling WebServices
- Integrating with Akka
- Internationalization
- The application Global object
- Testing your application