原文地址:https://www.jianshu.com/p/63c21bfd1910
1、AJAX DATA怎么传输的问题
在contentType默认值: "application/x-www-form-urlencoded"的情况下
在调用JQUERY的$.ajax函数时候的data属性中,无论是POST还是GET,假如要传输的data是对象obj,我们可以直接写
data:obj ,也可以 data:$.param(obj)
原因在于AJAX能够自动判断data的类型,如果是字符串则直接传输,如果是对象则会先调用$.param(obj)再进行传输,源码如下
//在ajax()方法中,对json类型的数据进行了$.param()处理
if ( s.data && s.processData && typeof s.data !== "string" ) {
s.data = jQuery.param( s.data, s.traditional );
下面是W3C上对于AJAX的DATA选项的一个说明
data
类型:String
发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。
2、GET POST传输方式对于DATA的影响
在contentType默认值: "application/x-www-form-urlencoded"的情况下
上面说了data:可以接对象也可以接对象转换后的查询字符串,最终都是传输查询字符串
对于GET,data查询字符串会直接拼接在URL后面传输到后台
比如/query?x=bar1&y=bar2,后台接收的时候直接requestParam接收就行了。
对于POST,data查询字符串不会直接接在URL后面,而是以请求体的方式保存在FORM DATA中进行传输
比如x=bar1&y=bar2,后台接收的时候仍然是直接@RequestParam接收就行了,但是数据不会显示在URL后面,URL仍然是/query
如果contentType是 "application/json"的话
对于GET,data查询字符串仍然是会直接拼接在URL后面传输到后台,没有影响
对于POST,data仍是以请求体的方式进行传输,但是却是保存在REQUEST PAYLOAD中,这种方式就没办法直接用@RequestParam接收,而是要使用到@RequestBody,这就跟Spring MVC的消息转换机制有关了。
不仅仅是application/json,对于上传文件等等的contentType,data也都是保存在REQUEST PAYLOAD中。
如果POST既要上传文件又要上传一些参数的,一种是直接在POST的URL后面拼接参数,然后FormData中只保留数据文件;另一种就是文件和参数都放在FormData也是没有问题的。
另外上传文件方面还要注意一下AJAX的processData这个选项,要设置为 false
processData
类型:Boolean
默认值: true。默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
作者:晚歌y
链接:https://www.jianshu.com/p/63c21bfd1910
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。