一、什么是body parser?
body parser(不知道具体如何翻译,~~~~(>_<)~~~~ )指一个HTTP请求 (如POST和PUT操作)所包含的文本内容(body),这个body就HTTP response中的Content-Type header,该body可能是XML、JSON、二进制码(binary data)、文本或其他Content-type类型,而body parser的功能就是将这一请求body转换为JAVA。 其解析过程见下图:
说明:
- 不能直接直接JAVA来写BodyParser,因为Play的BodyParser必须用Iteratee[Array[Byte]来处理动态的body content,JAVA是静态语言,所以只能使用Scala来写BodyParser
- 所幸的是Play已经提供了一些常用的BodyParser API,如解析JSON、XML、Text、上传文件等,我们可以在JAVA中直接使用这些API
二、body-parser API
在Java BodyParser API中,所有的body parsers必须生成play.mvc.Http.RequestBody值,该值通过
a request().body()
返回获得
还可以是使用@BodyParser.注解进行部分的body parser
,如我们可以通过body.asJson() 得到一个JSON body
内置的body parser: AnyContent
text/plain | String | accessible via asText() |
application/json | JsonNode | accessible via asJson() |
text/xml | org.w3c.Document | accessible via asXml() |
application/form-URL-encoded | Map<String, String[]> | asFormUrlEncoded() |
multipart/form-data | Http.MultipartFormData | accessible via asMultipartFormData() |
Any other content type | Http.RawBuffer | accessible via asRaw() |
说明: 如果请求的body type不可行,这些方法返回的是null
pulic static Result save() { RequestBody body = request().body(); String textBody = body.asText(); if(textBody != null) { ok("Got: " + text); } else { badRequest("Expecting text/plain request body"); } }
三、content的最大尺寸——Max content length
基于文本类型的body parsers (如text, json, xml或formUrlEncoded)可以使用最大的content length,因为它们得将内容装载入内存。
content length的默认大小是100KB,可以在application.conf中设置默认值,如下代码
parsers.text.maxLength=128K
还可以通过@BodyParser.Of注解来定义其大小
:
// Accept only 10KB of data. @BodyParser.Of(value = BodyParser.Text.class, maxLength = 10 * 1024) pulic static Result index() { if(request().body().isMaxSizeExceeded()) { return badRequest("Too much data!"); } else { ok("Got body: " + request().body().asText()); } }
参考:http://www.playframework.com/documentation/2.0/JavaBodyParsers