Play framework Body分析器

来源:互联网 发布:Js 中isinfinite 编辑:程序博客网 时间:2024/05/22 12:12

什么叫做body分析器?

一个HTTP请求(至少对于使用POST或者PUT的操作)包含一个body,这个body可以被格式化为任何指定在Content-type头指定的格式,一个JAVA解析器转换这个请求的body为Java结果值。


注意:你不能写BodyParser 直接使用JAVA来实现,因为一个Play  BodyParser 必须处理body内容使用 Iteratee[Array[Byte], A],它必须用Scala实现。

然而Play提供了一个默认的BodyParsers这应该适合大多数用例(转换json、xml、text、upload files),并且你可以重用哪些分析器,在Java中你可以使用这些默认的解析器来创建,例如你可以创建一个RDF分析器基于text。


BodyParser 的Java API

在Java的API,所有的body解析器必须产生一个play.mvc.Http.RequestBody的值,这个值是被body解析器计算然后可以通过request().body()检索;

public static Result index() {  RequestBody body = request().body();  return ok("Got body: " + body);}
你可以指定BodyParser 来指定特定的动作来使用@BodyParser.Of注解。

@BodyParser.Of(BodyParser.Json.class)public static Result index() {  RequestBody body = request().body();  return ok("Got json: " + body.asJson());}
就像我们刚才所说的所有的java API body解析器将会给你一个play.mvc.Http.RequestBody值,从这个body对象你可以检索请求body内容最合适的Java类型。


注意:如果这个解析器被用作解析它所不支持的Content-type,这个RequestBody方法像asText() or asJson() 将会返回null,例如在一个action方法上使用@BodyParser.Of(BodyParser.Json.class)注释,调用asXml()方法将会返回null.


一些分析器能够指定特定的类型而不是Http.RequestBody,你可以自动的将请求主题转换成另外一种类型使用as(...)方法。

@BodyParser.Of(BodyLengthParser.class)public static Result index() {  BodyLength body = request().body().as(BodyLength.class);  ok("Request body length: " + body.getLength());}

默认分析器

如果你没有指定你的body分析器,Play将会使用默认的最适合的Content-type从content-type上

  • text/plainString, accessible via asText()
  • application/jsonJsonNode, accessible via asJson()
  • application/xmltext/xml or application/XXX+xmlorg.w3c.Document, accessible via asXml()
  • application/form-url-encodedMap<String, String[]>, accessible viaasFormUrlEncoded()
  • multipart/form-dataHttp.MultipartFormData, accessible viaasMultipartFormData()
  • Any other content type: Http.RawBuffer, accessible via asRaw()

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");  }}
最大的Content长度

基于文本的分析器(例如json、xml、text、formUrlEncoded)有一个最大的文本长度,因为它们必须将所有内容加载到内存中。


提示:默认的content大小可以定义在application.conf

parsers.text.maxLength=128K


你也可以使用@BodyParser.Of注释指定content大小

// 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 {    ok("Got body: " + request().body().asText());   }}

原创粉丝点击