当前位置: 首页 > news >正文

《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/plainStringaccessible via asText()
application/jsonJsonNodeaccessible via asJson()
text/xmlorg.w3c.Documentaccessible via asXml()
application/form-URL-encodedMap<String, String[]>asFormUrlEncoded()
multipart/form-dataHttp.MultipartFormDataaccessible via asMultipartFormData()
Any other content typeHttp.RawBufferaccessible 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

相关文章:

  • android alipay
  • 2014 BDTC 參会有感
  • [C#基础知识系列]专题十七:深入理解动态类型
  • 8天学通MongoDB——第四天 索引操作
  • 20个开源项目托管站点推荐
  • coursera 公开课 文本挖掘和分析(text mining and analytics) week 1 笔记
  • win7下使用Taste实现协同过滤算法
  • 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
  • 分享一款快速APP功能测试工具
  • R语言编程艺术#04#数据框(data.frame)
  • 动态规划(DP),0-1背包问题
  • 各大公司广泛使用的在线学习算法FTRL详解
  • .Net CF下精确的计时器
  • SSH 正向/反向代理小记
  • 寻求最快解决方案
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • export和import的用法总结
  • Invalidate和postInvalidate的区别
  • JavaScript HTML DOM
  • javascript从右向左截取指定位数字符的3种方法
  • java小心机(3)| 浅析finalize()
  • js继承的实现方法
  • quasar-framework cnodejs社区
  • Shell编程
  • Swoft 源码剖析 - 代码自动更新机制
  • Vue2.x学习三:事件处理生命周期钩子
  • 笨办法学C 练习34:动态数组
  • 给第三方使用接口的 URL 签名实现
  • 简单数学运算程序(不定期更新)
  • 面试遇到的一些题
  • 区块链共识机制优缺点对比都是什么
  • 线性表及其算法(java实现)
  • 详解NodeJs流之一
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 回归生活:清理微信公众号
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #include<初见C语言之指针(5)>
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (HAL库版)freeRTOS移植STMF103
  • (Java)【深基9.例1】选举学生会
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (三)mysql_MYSQL(三)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (状压dp)uva 10817 Headmaster's Headache
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Family_物联网
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET性能优化(文摘)
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @Bean注解详解