application/json 与 application/x-www-form-urlencoded的简单比较

application/x-www-form-urlencoded

提交请求示例

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

wireshark抓包结果

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

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

application/json

提交请求示例

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

wireshark抓包结果

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

//com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter#readInternal
protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    InputStream in = inputMessage.getBody();
    byte[] buf = new byte[1024];

    while(true) {
        int bytes = in.read(buf);
        if(bytes == -1) {
            byte[] bytes1 = baos.toByteArray();
            return JSON.parseObject(bytes1, 0, bytes1.length, this.charset.newDecoder(), clazz, new Feature[0]);
        }

        if(bytes > 0) {
            baos.write(buf, 0, bytes);
        }
    }
}

混用示例

web层代码

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

提交请求

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

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

找到post请求解析参数源码

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

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

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

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

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

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

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

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

时间: 2024-10-07 05:46:09

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

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

'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-ui' //使用elementui的提示显示 import { Loading } from 'element-ui' import router from "../router"; let loading function startLoading() { loading = Loadin

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

HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式. 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主体.类似于下面这样: <method> <request-url> <version&

ajaxfileupload.js ajax上传文件(含application/json)

jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; if(window.ActiveXObject) { var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />'); if(ty

application/json 四种常见的 POST 提交数据方式

application/json 四种常见的 POST 提交数据方式 四种常见的 POST 提交数据方式 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式. 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主

(The application/json Media Type for JavaScript Object Notation (JSON))RFC4627-JSON格式定义

原文  http://laichendong.com/rfc4627-zh_cn/ 摘要 JavaScript Object Notation (JSON)是一个轻量级的,基于文本的,跨语言的数据交换格式.它从ECMAScript编程语言标准(ECMAScript Programming Language Standard)衍生而来.JSON定义了一组用于表示结构化数据的可移植的格式化规则. 1. 简介 JavaScript Object Notation (JSON)是用于结构化数据序列化的一

使用 .net WEBAPI 返回 application/json类型导致 IE8 提示下载

1, 场景介绍 项目使用了 jquery.form.js这个插件,用 ajax的方式提交 form 表单里面的信息.因为需要使用 ajax获取到返回信息.数据录入使用的是 .net mvc方式的 webapi数据接口进行提交录入. 2, 问题 在IE 8及以下版本遇到,提交成功后,返回过来的数据格式是: application/json,在IE 8 (含)以下版本中直接提示下载 该 json. 3, 解决方法 修改在 系统中的 App_Start 文件夹中的 WebApiConfig.cs.删除

Ajax的text/plain、application/x-www-form-urlencoded和application/json

Ajax的text/plain.application/x-www-form-urlencoded和application/json HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后面,如果是post请求,那么表单参数是在请求体中,也是以name=value&name1=value1的形式在请求体中.通过chrome的开发者工具可以看到如下(这里是可读的形式,不是真正的HTTP请求协议的请求格式): get请求: [plai

四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml)

HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式. 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主体.类似于下面这样: <method> <request-URL> <version&

请求头header里的contentType为application/json和capplition/x-www-form-urlencoded

application/x-www-form-urlencoded 最常见的 POST 提交数据的方式了.浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据. application/json 用来告诉服务端消息主体是序列化后的 JSON 字符串. 参考:https://www.cnblogs.com/softidea/p/5745369.html 原文地址:https://www