application/x-www-form-urlencoded

提交请求示例

  1. curl -X POST 'http://localhost:8080/formPost' -'id=1&name=foo&mobile=13612345678'

wireshark抓包结果

对应的服务端解析参数源码

  1. //org.springframework.web.method.annotation.RequestParamMethodArgumentResolver#resolveName
  2. if (arg == null) {
  3. String[] paramValues = webRequest.getParameterValues(name);
  4. if (paramValues != null) {
  5. arg = paramValues.length == 1 ? paramValues[0] : paramValues;
  6. }
  7. }

application/json

提交请求示例

  1. curl -X POST -"Content-Type: application/json" 'http://localhost:8080/jsonPost' -'{"id":2,"name":"foo","mobile":"13656635451"}'

wireshark抓包结果

对应的服务端解析参数源码

  1. //com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter#readInternal
  2. protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
  3. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  4. InputStream in = inputMessage.getBody();
  5. byte[] buf = new byte[1024];
  6. while(true) {
  7. int bytes = in.read(buf);
  8. if(bytes == -1) {
  9. byte[] bytes1 = baos.toByteArray();
  10. return JSON.parseObject(bytes1, 0, bytes1.length, this.charset.newDecoder(), clazz, new Feature[0]);
  11. }
  12. if(bytes > 0) {
  13. baos.write(buf, 0, bytes);
  14. }
  15. }
  16. }

混用示例

web层代码

  1. @RequestMapping(value="/mixPost", method=RequestMethod.POST )
  2. public Result<Void> mixPostTest(@RequestBody @Valid Foo foo, @RequestParam Integer sex)

提交请求

  1. curl -X POST -"Content-Type: application/json" 'http://localhost:8080/mixPost?sex=1' -'{"id":2,"name":"foo","mobile":"13656635451"}'

补充--如何定位对应的源码

找到post请求解析参数源码

  1. @RequestMapping(value="/formPost", method=RequestMethod.POST )
  2. public Result<Void> formPostTest(@RequestParam int id, @RequestParam String name, @RequestParam String mobile)

因为id是必填参数 如果请求参数中不含id的话 会报错 如下所示

  1. org.springframework.web.bind.MissingServletRequestParameterException: Required int parameter 'id' is not present
  2. at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:255)
  3. at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:95)
  4. at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79)
  5. at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
  6. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)

通过此方法可以快速定位到源码

找到json请求解析参数的源码

  1. @RequestMapping(value="/jsonPost", method=RequestMethod.POST )
  2. public Result<Void> jsonPostTest(@RequestBody @Valid Foo foo)

因为肯定要先构造一个空Foo对象 然后才能注入各属性值 所以在Foo的无参构造函数中加断点, 可以定位到json请求解析参数的源码

转载:https://segmentfault.com/a/1190000007252829

application/json 与 application/x-www-form-urlencoded的简单比较的更多相关文章

  1. multipart/form-data,application/json和application/x-www-form-urlencoded区别

    application/json和application/x-www-form-urlencoded都是表单数据发送时的编码类型. EncType: enctype 属性规定在发送到服务器之前应该如何 ...

  2. application/json和application/x-www-form-urlencoded区别

    application/json和application/x-www-form-urlencoded都是表单数据发送时的编码类型. EncType: enctype 属性规定在发送到服务器之前应该如何 ...

  3. 在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)

    'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-u ...

  4. vue(axios)封装,content-type由application/json转换为application/x-www-form-urlencoded

    现在主流的http请求头的content-type有三种(不讨论xml): application/x-www-form-urlencoded  最常见的提交数据方式,与原生form表单数据一致,在c ...

  5. application/json和application/x-www-form-urlencoded使用选择

    一.参考资料 选application/x-www-form-urlencoded还是application/json? @RequestBody应用 二.理解 1.@RequestBody的作用 注 ...

  6. application/json 和 application/x-www-form-urlencoded的区别

    public static string HttpPost(string url, string body) { //ServicePointManager.ServerCertificateVali ...

  7. application/json和application/x-www-form-urlencoded参数接收

    application/json ajax请求中content-type:application/json代表参数以json字符串传递给后台,controller接收需要@RequestBody 接收 ...

  8. IE10以下的IE浏览器在form表单提交、a标签等场景下,接收application/json类型的响应时,会提示是否要下载该json文件

    IE10以下的IE浏览器并不支持application/json这种response格式,所以需要在服务端先将对象转成json字符串然后,设置Content-Type为text/html的类型,再返回 ...

  9. !!!四种常见的 POST 提交数据方式(含application/json)

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

随机推荐

  1. linux上的语音识别程序

    ubuntu下安装: $ sudo add-apt-repository ppa:hgneng/ekho $ sudo apt-get update $ sudo apt-get -y install ...

  2. MATLAB左除和右除

    矩阵的除法包括左除(A\B).右除(A/B)和点除(A./B)三种. 一般情况下,x = A\b是方程组A*x = b的解, 而x = b/A是方程组x*A = b的解, x = A./B表示同型矩阵 ...

  3. Fiddler filter 过滤隐藏css、js、图片等

    REGEX:(?insx)/[^\?/]*\.(css|ico|jpg|png|gif|bmp|wav|js|jpeg)(\?.*)?$ Fiddler教程 http://www.jianshu.co ...

  4. AAPT err(Facade for): libpng error: Not a PNG file 错误解决

    在导入项目到Android studio后,若编译出现“AAPT err(Facade for): libpng error: Not a PNG file”错误. 该错误表示项目中的drawable ...

  5. C# using关键字 --转

    其实对于.NET的学习者一开始都接触using这个关键字了,可能大家没有怎么在意,包括我本人也是的,直到今天有人问我using的作用时,才引起了我的注意.       概况来说可以分为两种:第一种,就 ...

  6. 微服务之springCloud和docker-provide(二)

    简介 通过上一节我们已经通过docker-compose在swarm中部署了有三个实例的高可用eureka服务注册中心,本节我们讨论一下,怎么在创建一个spring cloud生产者,并用docker ...

  7. C语言 · 日期计算

    算法提高 日期计算   时间限制:1.0s   内存限制:256.0MB      问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰 ...

  8. drupal

    一 devel 模块 配置->development->generate users 添加测试账号 php区块 结构->区块->switch user 使用者切换 结构-> ...

  9. Spring Boot Gradle 打包可执行Jar文件!

    使用Gradle构建项目,继承了Ant的灵活和Maven的生命周期管理,不再使用XML作为配置文件格式,采用了DSL格式,使得脚本更加简洁. 构建环境: jdk1.6以上,此处使用1.8 Gradle ...

  10. 创建Maven项目出错

    有时候创建maven项目的时候会出错,例如在创建Spring cloud 2 项目的时候,会出现org.apache.maven.archiver.MavenArchiver.getManifest( ...