@RequestBody注解Ajax post json List集合數(shù)據(jù)請(qǐng)求400/415的處理
@RequestBody注解Ajax post json List集合數(shù)據(jù)請(qǐng)求400/415
該問(wèn)題出現(xiàn)在ajax發(fā)送post請(qǐng)求時(shí)返回錯(cuò)誤代碼,后臺(tái)不報(bào)任何錯(cuò)誤
問(wèn)題原因和解決方法:
1.post發(fā)送的json數(shù)據(jù)錯(cuò)誤
@RequestBody注解是把post請(qǐng)求的整體數(shù)據(jù)進(jìn)行處理,@RequestBody后面的參數(shù)是和json數(shù)據(jù)沒(méi)有關(guān)系的,比如
@RequestBody List<CourseVo> courseVos; //此句的courseVos不用在json數(shù)據(jù)中包含?。。。?!
發(fā)送該數(shù)據(jù)的js為下
$.ajax({ ? ? ?type: "post", ? ? ?url: '/beansOffice/addCourseData', ? ? ?dataType:"json", ? ? ?contentType:"application/json", ? ? ?data: JSON.stringify(this.courseView),//此塊注意 ? ? ?//注意數(shù)據(jù)是data: JSON.stringify(this.courseView) ?? ? ? ?//而不是data: JSON.stringify({courseVos:this.courseView}) ? ? ?//兩者區(qū)別就是有沒(méi)有把@RequestBody注解后的“courseVos”當(dāng)為json數(shù)據(jù) ? ? ?success: function (data) { ? ? ? ? if (data.status == 200 && data.body.code == 200) ? ? ? ? ? ? ? alert("提交成功!"); ? ? ?} });
2.Spring或maven版本過(guò)低導(dǎo)致jackson包沒(méi)有導(dǎo)入
jackson是spring默認(rèn)的json處理工具,沒(méi)有該包則會(huì)對(duì)一些復(fù)雜對(duì)象會(huì)處理異常
依賴包為下(當(dāng)前最新):
<dependency> ? ? <groupId>org.codehaus.jackson</groupId> ? ? <artifactId>jackson-core-asl</artifactId> ? ? <version>1.9.13</version> </dependency> <dependency> ? ? <groupId>org.codehaus.jackson</groupId> ? ? <artifactId>jackson-mapper-asl</artifactId> ? ? <version>1.9.8</version> </dependency>
3.json數(shù)據(jù)和對(duì)象數(shù)據(jù)轉(zhuǎn)換出問(wèn)題
這個(gè)問(wèn)題很容易出,由于異常被吃掉很不容易發(fā)現(xiàn)
比如對(duì)象中定義數(shù)據(jù) int a;但是你有可能默認(rèn)值是“”,即空字符串,則也會(huì)直接報(bào)400錯(cuò)誤而后臺(tái)沒(méi)有任何異常
還有一些比如時(shí)間類型(data)、布爾(boolean)或自定義類型,建議所有都使用String,自己手動(dòng)在后臺(tái)轉(zhuǎn)換,這樣報(bào)錯(cuò)也會(huì)被發(fā)現(xiàn)
$.ajax 中關(guān)于get、post 與@RequestBody和@RequestParam使用注意
1、在GET請(qǐng)求中,不能使用@RequestBody。因?yàn)橥鵊ET請(qǐng)求里加body是不符合規(guī)范的,不保證所有的實(shí)現(xiàn)都支持,所以在ajax 里注意請(qǐng)求方式如果用 get 后端參數(shù)不能用 @RequestBody 來(lái)接收它。(所以本人在 ajax ,或者什么表單,一般愛(ài)好用post,既安全,又能解決中文亂碼問(wèn)題)
2、在POST請(qǐng)求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對(duì)于參數(shù)轉(zhuǎn)化的配置必須統(tǒng)一。可以使用多個(gè)@RequestParam獲取數(shù)據(jù),@RequestBody不可以只能一個(gè)。
3、ajax請(qǐng)求默認(rèn) contentType=application/x-www-form-urlencoded;charset:utf-8,此格式為表單提交格式,數(shù)據(jù)為key1=value1&key2=value2格式
不使用contentType:‘application/json;charset=UTF-8’, 則data里可以是json對(duì)象的屬性
$.ajax({ ?? ?url: "", ?? ?type: "POST", ?? ?dataType: "JSON", ?? ?data: {"id": 1}, ?? ?async: false, ?? ?success: function(){ ?? ? ?? ?} });
注意:data 右邊花括號(hào)外邊是沒(méi)有雙引號(hào)或引號(hào)的 “” ‘’,所以data叫做 json對(duì)象,而不是叫json字符串,里面是其屬性。(所以上面是不使用contentType:'application/json;charset=UTF-8’的例子)
使用contentType:'application/json;charset=UTF-8’的例子:就得使用json字符串而非 JSON 對(duì)象了
$.ajax({ ?? ?url: "", ?? ?type: "POST", ?? ?dataType: "JSON", ?? ?contentType: "application/json", ?? ?data: "{'id': "+ 1 + "}", ?? ?async: false, ?? ?success: function(){ ?? ? ?? ?} });
data 右邊括號(hào)外有引號(hào)的叫 JSON 字符串
前端發(fā)送復(fù)雜JSON數(shù)據(jù),后端使用@RequestBody接收
舉例子:
$.ajax({ ?? ?url: "", ?? ?type: "POST", ?? ?dataType: "JSON", ?? ?contentType: "application/json;charset=UTF-8", ?? ?data: JSON.stringify({ ?? ??? ?id:"1" ?? ?}), ?? ?async: false, ?? ?success: function(){ ?? ? ?? ?} });
后端用 @RequestBody 來(lái)接收傳過(guò)來(lái)的json字符串
注意:
- JSON.stringify 是從一個(gè)對(duì)象中解析出字符串
- JSON.parse是從一個(gè)字符串中解析出json(鍵值對(duì))
- 使用:contentType:‘application/json;charset=UTF-8’, 配合:data:JSON.stringify()
@RequestParam 介紹
主要用來(lái)接收GET請(qǐng)求拼接在URL后的參數(shù),或者是POST傳遞,且Content-type為x-www-form-urlencoded方式。
因?yàn)椴还苁荊ET方式還是用x-www-form-urlencoded方式傳遞,參數(shù)都是以鍵值對(duì)方式拼接的,然后經(jīng)過(guò)URLencoded編碼,傳遞給服務(wù)端。
@RequestParam 只能接收簡(jiǎn)單參數(shù)類型,復(fù)雜的參數(shù)類型要用 @RequestBody 來(lái)接收,或者不加注解來(lái)接收。
@RequestBody 介紹
使用 @RequestBody 該注解,前端請(qǐng)求只能為 POST,因?yàn)樵撟⒔馐菑恼?qǐng)求體中獲得對(duì)象的。且請(qǐng)求頭中的Content-type一般為application/json 方式。
所以使用該注解能夠接收 JSON 格式的數(shù)據(jù),并且能把接收到的 JSON 數(shù)據(jù)綁定到 JAVA 對(duì)象中。復(fù)雜對(duì)象包括List,實(shí)體類,Map對(duì)象等。
在用該注解的時(shí)候有兩個(gè)注意事項(xiàng):
- 一個(gè)方法中只能有一個(gè)@RequestBody注解,但是@RequestBody注解可以和@RequestParam注解一起使用,而且@RequestParam注解一個(gè)方法中可以有多個(gè)。
- @RequestBody注解的參數(shù)類型可以是復(fù)雜對(duì)象類。
不加注解接收
- 不加注解接收參數(shù),參數(shù)類型可以為簡(jiǎn)單類型,也可以為復(fù)雜類型(JAVA對(duì)象等,前端傳遞的參數(shù)會(huì)和類中的屬性名對(duì)應(yīng)并且綁定)。也就是兩種類型都可接收。
- 而且GET請(qǐng)求和POST請(qǐng)求也都能接收到參數(shù)。
- 但是POST請(qǐng)求時(shí),和@RequestParam注解一樣,Content-type只能為x-www-form-urlencoded。
- 不加注解可以接收復(fù)雜對(duì)象,但是不能接收Map類型的對(duì)象。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot啟動(dòng)遇到的異常問(wèn)題及解決方案
這篇文章主要介紹了SpringBoot啟動(dòng)遇到的異常問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程)
這篇文章主要介紹了Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09SpringBoot動(dòng)態(tài)生成接口實(shí)現(xiàn)流程示例講解
最近遇到一個(gè)需求,需要在程序運(yùn)行過(guò)程中,可以動(dòng)態(tài)新增接口,自定義接口參數(shù)名稱,基本類型,以及請(qǐng)求方法,請(qǐng)求頭等等。通過(guò)幾天的研究,找到了我需要的解決方案2023-01-01springboot2.0以上調(diào)度器配置線程池的實(shí)現(xiàn)
這篇文章主要介紹了springboot2.0以上調(diào)度器配置線程池的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java LocalCache 本地緩存的實(shí)現(xiàn)實(shí)例
本篇文章主要介紹了Java LocalCache 本地緩存的實(shí)現(xiàn)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-05-05feign調(diào)用返回object類型轉(zhuǎn)換方式
這篇文章主要介紹了feign調(diào)用返回object類型轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06詳解rabbitmq創(chuàng)建queue時(shí)arguments參數(shù)注釋
這篇文章主要介紹了rabbitmq創(chuàng)建queue時(shí)arguments參數(shù)注釋,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Java基于字符流形式讀寫(xiě)數(shù)據(jù)的兩種實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java基于字符流形式讀寫(xiě)數(shù)據(jù)的兩種實(shí)現(xiàn)方法示,結(jié)合實(shí)例形式分析了java逐個(gè)字符讀寫(xiě)及使用緩沖區(qū)進(jìn)行讀寫(xiě)操作的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01