前言:
和搭档进行接口联调的时候,每次浏览器端进行了请求体的设置,但是在服务器端一直都接收不到我传递过的去参数。每次都尝试设置不同的 Content-Type 值,排除问题。写篇文章记录下方便日后复习。
正文:
之前写过一篇文章关于 HTTP请求体编码方式 HTTP请求体编码方式_请求体是文件时 用什么编码-CSDN博客
关于 HTTP 请求体编码方式 无非这三个 application/x-www-form-urlencoded、application/json 和 multipart/form-data
在<form>标签中,enctype 属性规定在向服务器发送表单数据之前如何对数据进行编码。
方式一: application/x-www-form-urlencoded (默认方式)
数据格式:key1=value1&key2=value2 (URL编码)
方式二:multipart/form-data
用于文件上传,数据以 boundary 分隔
方式三:text/plain
纯文本格式(较少使用)
当action 为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字符串(name=value1&name2=value2...),然后把这个字符串拼接到url后面,用?分隔。
当action为post时候,浏览器把form数据封装到http body中,然后发送到服务器。如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了,但是如果有type=file的话,就要用到multioart/form-data,浏览器会把整个表单位以控件为分割单位,并为每个部分加上Content-Disposition(form-data或file),Content-Type(默认为text/plain),name(空间name)等信息,并加上分割符(boundary)
enctype 属性通常用于<form>元素,但在JQuery的AJAX请求中,对应的概念是contentType(用于设置请求头的Content-Type)。JQuery会根据contentType和data的类型自动处理数据的编码。
JQuery AJAX中 contentType (相当于enctype)
contentType | 数据格式 | 使用场景 |
application/x-www-form-urlencoded(默认) | name=lisi&age=30 | 普通表单 |
multipart/form-data | 带boundary的分块数据 | 文件上传(需配合FormData) |
application/json | {"name":"lisi","age":30} | 发送JSON数据 |
示例代码:
//默认 x-www-form-urlencoded
$.ajax({url:"/user",type:'post',dataType:'json',//预期服务器返回的数据类型data:{ //发送到服务器的数据,仅自动转换为请求字符串格式,name:"李四",age:30}
})//multipart/form-data(文件上传)
let formData = new FormData()
formData.append("name","李四")
formData.append("file",fileInput.files[0])$.ajax({url:'/uploadFile',type:'post',data:formData,processData:false,//禁止jQuery处理数据contentType:false, //让浏览器自动设置Content-Type为multipart/form-data
})//application/json (发送JSON) ---- 手动设置contentType 并使用JSON.stringify
$.ajax({url:'/sendJson',type:'post',contentType:'application/json', //设置请求头data:JSON.stringify({name:'lisi',age:30})
})
在jQuery的AJAX请求中,默认的Content-Type会根据请求的数据类型和数据格式自动设置
1、当发送get请求或没有请求体时,通常不会设置Content-Type头,因为get请求没有请求头
2、当发送POST请求且data是普通对象(如{key:'value'})时:jQuery默认使用 application/x-www-form-urlencoded;charset=UTF-8,数据会被编码成key=value&key2=value2的形式
3、当发送POST请求且data是FormData对象时,jQuery会自动设置Content-Type为multupart/form-data,并附带正确的boundary。如果是FormData或Blob等特殊数据,jQuery会调整Content-Type,但通常需要配合processData:false和contentType:false使用。
4、当发送POST请求且data是JSON字符串(如:JSON.stringfy({key:'value'}))时,需要手动设置Content-Type:application/json,否则jQuery不会自动处理。
axios默认使用的是application/json格式 !!!