摘要:場景如下前端使用向后臺發(fā)了一個為的請求,后臺接口如下發(fā)現(xiàn)接收不到的信息。改為也一樣接收不到。表單請求提交時,使用的是,而使用原生的請求如果不指定請求頭,默認(rèn)使用的是。
場景如下:
前端vue使用axios向后臺發(fā)了一個Content-type為application/json的post請求,
后臺springmvc接口如下:
@RequestMapping("xxx") public Result xxx(User user) { Result result = Result.getSuccessResult(); return result; }
發(fā)現(xiàn)接收不到user的信息。
改為 request.getParamter 也一樣接收不到。
搜索一番,從這篇博客找到了答案
AJAX POST請求中參數(shù)以form data和request payload形式在servlet中的獲取方式
jquery在執(zhí)行post請求時,會設(shè)置Content-Type為application/x-www-form-urlencoded,所以服務(wù)器能夠正確解析,而使用原生ajax請求時,如果不顯示的設(shè)置Content-Type,那么默認(rèn)是text/plain,這時服務(wù)器就不知道怎么解析數(shù)據(jù)了,所以才只能通過獲取原始數(shù)據(jù)流的方式來進(jìn)行解析請求數(shù)據(jù)。
HTTP POST表單請求提交時,使用的Content-Type是application/x-www-form-urlencoded,而使用原生AJAX的POST請求如果不指定請求頭RequestHeader,默認(rèn)使用的Content-Type是text/plain;charset=UTF-8。
由于Tomcat對于Content-Type multipart/form-data(文件上傳)和application/x-www-form-urlencoded(POST請求)做了“特殊處理”。
服務(wù)器為什么會對表單提交和文件上傳做特殊處理,是因?yàn)楸韱翁峤粩?shù)據(jù)是名值對的方式,且Content-Type為application/x-www-form-urlencoded,而文件上傳服務(wù)器需要特殊處理,普通的post請求(Content-Type不是application/x-www-form-urlencoded)數(shù)據(jù)格式不固定,不一定是名值對的方式,所以服務(wù)器無法知道具體的處理方式,所以只能通過獲取原始數(shù)據(jù)流的方式來進(jìn)行解析。
總結(jié)為:原生ajax如果不指定Context-type默認(rèn)使用text/plain;charset=UTF-8,jquery的ajax則是application/x-www-form-urlencoded,而axios底層正是使用了原生的ajax,后端會對非Content-type不為application/x-www-form-urlencoded的請求做特殊處理,由此導(dǎo)致后端request.getParameter()無法接收。
解決方法:
1、不使用框架的情況下,使用原始的讀取流的方式:
private String getRequestPayload(HttpServletRequest req) { StringBuildersb = new StringBuilder(); try(BufferedReaderreader = req.getReader();) { char[]buff = new char[1024]; intlen; while((len = reader.read(buff)) != -1) { sb.append(buff,0, len); } }catch (IOException e) { e.printStackTrace(); } returnsb.toString(); }
2、使用spring框架:
加入@RequestBody注解,如下:
@RequestMapping("xxx") public Result xxx(@RequestBody User user) { Result result = Result.getSuccessResult(); return result; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76521.html
摘要:最近做項(xiàng)目,做分頁的功能,使用給后臺發(fā)送數(shù)據(jù),使用接口還是工具都可獲取數(shù)據(jù),唯獨(dú)獲取不到經(jīng)過排除,發(fā)現(xiàn)這與的傳參格式有關(guān)系在使用時,要注意到配置選項(xiàng)中包含和兩者,以為他們是相同的,實(shí)則不然。因?yàn)槭翘砑拥降恼埱笞址械模糜谡埱蟆? 最近做vue項(xiàng)目,做分頁的功能,使用post給后臺發(fā)送數(shù)據(jù),使用接口還是工具(postman)都可獲取數(shù)據(jù),唯獨(dú)axios獲取不到;經(jīng)過排除,發(fā)現(xiàn)這與axi...
摘要:最近項(xiàng)目中使用也遇到了一些問題,就借此機(jī)會總結(jié)一下,如有錯誤,還請不吝指正。而在使用時對應(yīng)的傳參使用的是,是作為請求體發(fā)送的,同樣使用這種形式的還有等請求方式。層在環(huán)境中可以使用。 Axios是一個基于Promise的 HTTP 庫,可以用在瀏覽器和node.js 中,因?yàn)橛却蟠蟮耐扑],axios也變得越來越流行。最近項(xiàng)目中使用axios也遇到了一些問題,就借此機(jī)會總結(jié)一下,如有錯誤,...
摘要:本文的目的在于探討前后端數(shù)據(jù)交互,并給出不同的解決方案供大家參考。實(shí)際使用只需在配置文件配置其他配置其他組件配置以上就是前端處理和后端處理兩種解決方案,可根據(jù)實(shí)際情況選擇 一、前言 axios是vue項(xiàng)目中用來使用ajax技術(shù)來與后臺交換數(shù)據(jù)的一個組件,在vue的作者推薦下,相當(dāng)數(shù)量的vue前端開發(fā)人員開始使用它。但是在實(shí)際開發(fā)過程中,卻時有出現(xiàn)后端接收不到前端post過來的數(shù)據(jù)的情況...
摘要:本文的目的在于探討前后端數(shù)據(jù)交互,并給出不同的解決方案供大家參考。實(shí)際使用只需在配置文件配置其他配置其他組件配置以上就是前端處理和后端處理兩種解決方案,可根據(jù)實(shí)際情況選擇 一、前言 axios是vue項(xiàng)目中用來使用ajax技術(shù)來與后臺交換數(shù)據(jù)的一個組件,在vue的作者推薦下,相當(dāng)數(shù)量的vue前端開發(fā)人員開始使用它。但是在實(shí)際開發(fā)過程中,卻時有出現(xiàn)后端接收不到前端post過來的數(shù)據(jù)的情況...
摘要:最近做項(xiàng)目,需要用到后臺是第一次使用進(jìn)行請求,本以為同一樣,會很簡單,但是結(jié)果往往不讓人滿意啊,請求很簡單,這里就不說了,主要說下請求方式。以上只是個人的實(shí)踐經(jīng)過,有其他解決辦法的,歡迎留言。 最近做項(xiàng)目,需要用到vue,后臺是php,第一次使用axios進(jìn)行請求,本以為同ajax一樣,會很簡單,但是結(jié)果往往不讓人滿意啊,get請求很簡單,這里就不說了,主要說下 post請求方式。 使...
閱讀 2190·2021-09-22 10:56
閱讀 1492·2021-09-07 10:11
閱讀 1813·2019-08-30 15:54
閱讀 2299·2019-08-30 15:44
閱讀 2318·2019-08-29 12:40
閱讀 3040·2019-08-28 18:25
閱讀 1750·2019-08-26 10:24
閱讀 3195·2019-08-23 18:39