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