一、什么是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
本文详细介绍了Play框架中的BodyParser组件及其使用方法。BodyParser用于处理HTTP请求中的文本内容(body),并将其转换为Java可处理的数据结构。文章列举了各种内容类型(如JSON、XML、文本等)对应的BodyParser及获取方式,并介绍了如何设置body的最大尺寸。
数据类型解析——Body parser&spm=1001.2101.3001.5002&articleId=101334926&d=1&t=3&u=dd52d38fa5f840d3ac032dc488b995b2)
1796

被折叠的 条评论
为什么被折叠?



