《Play for Java》学习笔记(七)数据类型解析——Body parser

一、什么是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

你可能感兴趣的:(parser)