RequestPayload和Formdata

今天使用fecth作異步的服務獲取,調用方法以下jquery

return xFetch('/api/common/getsearchowner.json',{body: JSON.stringify(para),method:'POST'});

查看前臺發出的request以下ajax

POST /api/common/getsearchowner.json HTTP/1.1
Host: localhost:8989
Connection: keep-alive
Content-Length: 11
Pragma: no-cache
Cache-Control: no-cache
authorization:
Origin: http://localhost:8989
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
content-type: text/plain;charset=UTF-8
Accept: */*
Referer: http://localhost:8989/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6

且有一個request payload的值json

{"aaa":111}

而之前使用ajax的時候彷佛沒有這個值,而是一個form data記錄了post的值api

csrftoken:1472039431885

formdata和requestpayload到底有什麼區別呢、爲何用fecth的時候,提交的數據都變成了request payload?服務器

對於get請求,表單參數以name=value&name1=value1的形式附到url的後面app

對於post請求,表單參數是在請求體中,也是以name=value&name1=value1的形式在請求體中,而且post請求的Content-Type爲application/x-www-form-urlencoded,參數是在請求體中,即請求中的Form Data。在servlet中,能夠經過request.getParameter(name)的形式來獲取表單參數。異步

可是若是是原生的ajax請求,請求的Content-Type爲text/plain;charset=UTF-8,而請求表單參數在RequestPayload中。此時的POST請求是不會讀取請求體數據和進行相應的參數處理的,即不會解析表單數據來放到request parameter map中。因此經過request.getParameter(name)是獲取不到的。此時servelet中只能用解析流的解析post

爲何原生的ajax後者fetch不能獲取form data呢?fetch

jquery在執行post請求時,會設置Content-Type爲application/x-www-form-urlencoded,因此服務器可以正確解析,而使用原生ajax請求時,若是不顯示的設置Content-Type,那麼默認是text/plain,這時服務器就不知道怎麼解析數據了,因此才只能經過獲取原始數據流的方式來進行解析請求數據。url

解決方案是什麼呢?能夠再請求的時候增長

headers: {'Content-Type': 'application/x-www-form-urlencoded'}

參考文檔:http://stackoverflow.com/questions/10494574/what-is-the-difference-between-form-data-and-request-payload

http://blog.csdn.net/mhmyqn/article/details/25561535

相關文章
相關標籤/搜索