Content-type的幾種常見類型
一、是什么?
是Http的實體首部字段,用于說明請求或返回的消息主體是用何種方式編碼,在request header和response header里都存在。
二、幾個常用類型:
1、application/x-www-form-urlencoded
這應該是最常見的post編碼方式,一般的表單提交默認以此方式提交,$ajax默認提交就是使用這種格式。大部分服務器語言對這種方式都有很好的支持。在PHP中,可以用$_POST[“key”]的方式獲取到key的值,在node中我們可以使用querystring中間件對參數進行分離
1)瀏覽器的原生form表單
2) 提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key和val都進行了URL轉碼
POST [http://www.example.com](http://www.example.com) HTTP/1.1
Content-Type: application/x-[www-form-urlencoded](http://www-form-urlencoded);charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
2、multipart/form-data
這也是一種比較常見的post數據格式,我們用表單上傳文件時,必須使form表單的enctype屬性或者ajax的contentType參數等于multipart/form-data。
Submit
請求頭看起來像這樣
POST /foo HTTP/1.1Content-Length: 68137Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575
---------------------------974767299852498929531610575Content-Disposition: form-data; name="description"some text---------------------------974767299852498929531610575Content-Disposition: form-data; name="myFile"; filename="foo.txt"Content-Type: text/plain
(content of the uploaded file foo.txt)---------------------------974767299852498929531610575--
不同字段以--boundary開始,接著是內容描述信息,最后是字段具體內容。如果傳輸的是文件,還要包含文件名和文件類型信息
3、application/json
消息主體是序列化后的 JSON 字符串,這個類型越來越多地被大家所使用,axios默認提交就是使用這種格式。
POST [http://www.example.com](http://www.example.com) HTTP/1.1
Content-Type: application/json;charset=utf-8{"title":"test","sub":[1,2,3]}
這種方案,可以方便的提交復雜的結構化數據,特別適合 RESTful 的接口。各大抓包工具如 Chrome 自帶的開發者工具、Firebug、Fiddler,都會以樹形結構展示 JSON 數據,非常友好。
4、text/xml
是一種使用 HTTP 作為傳輸協議,XML 作為編碼方式的遠程調用規范
POST [http://www.example.com](http://www.example.com) HTTP/1.1
Content-Type: text/xml
examples.getStateName
41
三、axios 將post請求數據轉為formdata
1、后臺改變接收參數的方法
vue組件中,axios發送post請求的代碼如下:
this.$axios({
method:"post",
url:"/api/haveUser",
data:{
name:this.name,
password:this.password
}
}).then((res)=>{
console.log(res.data);
})
此時控制臺Network Headers里面的信息是這樣子的
后臺接收數據需要依賴body-parser中間件,我們事先裝好,接著在后臺代碼中引用body-parser
這張截圖中,發揮作用的代碼僅僅是const bodyParser=require("body-parser");
接下來在路由中使用body-parser
app.post("/api/haveUser",bodyParser.json(),function(req,res){
console.log(req.body);
let haveUser=require("../api/server/user.js");
haveUser(req.body.name,req.body.password,res);
});
這時,當前臺發送post請求之后,后臺控制臺中就會打印出req.body
這時,通過req.body.name或者req.body.password就能拿到對應的值。這種方法比較簡單,也不需要前臺做過多修改。
2、其中發揮關鍵作用的是headers與transformRequest。其中?headers?是設置即將被發送的自定義請求頭。?transformRequest?允許在向服務器發送前,修改請求數據。這樣操作之后,后臺querystring.parse(decodeURIComponent(data))獲取到的就是類似于{ name: 'w', password: 'w' }的對象。代碼如下:
axios({
url:'/api/index/getIndexlbt',
method:'post',
data: {
relevanceId:this.$route.params.id,
pictureType:4},
transformRequest: [function (data) {
let ret= ''
for (let it indata) {
ret+= encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'}returnret
}],
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
3、使用qs庫編碼數據
import qs from 'qs';const data = { 'bar': 123};const options ={
method:'POST',
headers: {'content-type': 'application/x-www-form-urlencoded'},
data: qs.stringify(data),
url,
};
axios(options);
4、axios配置后,post提交formdata
var fd = newFormData()
fd.append('file', files[0])
let config={
headers: {'Content-Type': 'multipart/form-data'}
}
axios.post(that.uploadUrl, fd,config).then( res=>{
console.log(res)
}).catch( res =>{
console.log(res)
})