javascript - jquery ajax contentType是啥意思?
問題描述
POST請求contentType設(shè)置為application/json,但請求卻把data的json轉(zhuǎn)成了字符串?請大神指教是什么原因?代碼如下
$.ajax({method: ’POST’,url: 'demo_test.txt',data: { aa: 1, bb: 2},contentType: 'application/json',success: function (result) {} });
請求抓包
POST http://localhost:8888/demo_test.txt HTTP/1.1Host: localhostConnection: keep-aliveContent-Length: 9Origin: localhostUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36Content-Type: application/jsonAccept: */*X-Requested-With: XMLHttpRequestReferer: http://172.17.35.112:8099/Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8Cookie: selectFluence=4; VFS_USERNAME=admin; VFS_PASSWORD=123456; VFS_APPURL=; VFS_ISSAVE=true; VFS_ISDMZ=true; webserver_is_save=0; _alert=1495876699555aa=1&bb=2
問題解答
回答1:參考:jQuery.ajax() 文檔
contentType (default: ’application/x-www-form-urlencoded; charset=UTF-8’)
Type: Boolean or String
When sending data to the server, use this content type. Default is 'application/x-www-form-urlencoded; charset=UTF-8', which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). As of jQuery 1.6 you can pass false to tell jQuery to not set any content type header. Note: The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding. Note: For cross-domain requests, setting the content type to anything other than application/x-www-form-urlencoded, multipart/form-data, or text/plain will trigger the browser to send a preflight OPTIONS request to the server.
一般是用 application/x-www-form-urlencoded,也就是默認值,上傳文件通常是用 multipart/form-data,現(xiàn)在很多使用 JSON 接口的也用后面這種。text/plain 我平時見得不多。
補充jQuery 的 ajax 要發(fā)送 application/json 請求需要
contentType: 'application/json;charset=UTF-8'
processData: false
data: stringify(aObject)
比如
$.ajax('https://blablabla.com/', { contentType: 'application/json;charset=UTF-8', dataType: 'json', type: 'post', processData: false, data: JSON.stringify({user: { name: 'hello', pass: 'world'},stamp: new Date() })});
使用的數(shù)據(jù)格式
回答3:簡單來說,就是把你發(fā)請求的數(shù)據(jù)當做xxx類型處理。對應(yīng)的,dataType,就是把服務(wù)端響應(yīng)回來的數(shù)據(jù)當做xxx類型處理。
回答4:http中傳的數(shù)據(jù)都是都是字符串,只是服務(wù)器在接受到數(shù)據(jù)時會根據(jù)contentType來用不同的方式解析字符串。對象只能存在于內(nèi)存中,不僅僅是http,所有在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)都是基于字符串的。
回答5:首先我不覺得你的抓包有問題,如果你確實是用的是POST請求的話,從抓包看起來這是個GET請求,因為POST不會對請求參數(shù)做序列化處理
下面說下contentType是啥意思?
ajax的contentType是設(shè)置的http的請求頭,這個頭的目的是告訴服務(wù)器端,我的請求參數(shù)是什么格式的數(shù)據(jù),你要按照對應(yīng)的格式去處理,就這樣。默認的是 'application/x-www-form-urlencoded; charset=UTF-8',也就是普通的表單提交的格式,當然你也可以覆蓋,比如'application/json',這樣服務(wù)端可以直接拿到一個json請求參數(shù)。而不是一個一個的key value
回答6:這只是修改請求頭中的contentType,和你接受服務(wù)器響應(yīng)是什么內(nèi)容沒有關(guān)系。
你可以加上這個拿到j(luò)son格式的數(shù)據(jù)。
dataType:'json'
相關(guān)文章:
1. html5 - 我引用的是花瓣網(wǎng)上的圖片,在自己電腦上可以正常顯示(狀態(tài)碼200),但在別人電腦上是403forbid,有大神知道是什么嗎?2. javascript - 微信小程序picker為什么會變成兩行?3. objective-c - 同一個APP的微信登錄的微信開發(fā)平臺賬號和微信支付的微信開發(fā)平臺賬號可以是不同一個嗎?4. javascript - 百度echarts series數(shù)據(jù)更新問題5. css3 - [CSS] 動畫效果 3D翻轉(zhuǎn)bug6. flask+vue+webpack使用nginx+uwsgi部署問題7. javascript - 微信音樂分享8. javascript - 我寫的href跳轉(zhuǎn)地址不是百度,為什么在有的機型上跳轉(zhuǎn)到百度了,有的機型跳轉(zhuǎn)正確9. html5 - H5移動端UC瀏覽器的,跳轉(zhuǎn)下一個頁面,下一個頁面input輸入框獲取焦點后,會帶出上一頁的內(nèi)容?10. 在ios下 微信打開iframe鏈接的頁面時 在微信里長按無法識別二維碼
