当前位置: 首页 > 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 正向/反向代理小记
  • 寻求最快解决方案
  • [NodeJS] 关于Buffer
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 11111111
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Laravel 实践之路: 数据库迁移与数据填充
  • LeetCode18.四数之和 JavaScript
  • mysql_config not found
  • swift基础之_对象 实例方法 对象方法。
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 前端攻城师
  • 双管齐下,VMware的容器新战略
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • gunicorn工作原理
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #pragma预处理命令
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)项目管理杂谈-我所期望的新人
  • (转载)CentOS查看系统信息|CentOS查看命令
  • *2 echo、printf、mkdir命令的应用
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NetCore部署微服务(二)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET序列化 serializable,反序列化
  • /bin/rm: 参数列表过长"的解决办法
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @ComponentScan比较
  • @RequestMapping处理请求异常
  • @RestControllerAdvice异常统一处理类失效原因
  • @Service注解让spring找到你的Service bean
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务