接口400错误解析
今天我遇上一個(gè)讓我很痛心的錯(cuò)誤400。對(duì)程序員來(lái)說(shuō),這可能是一個(gè)最簡(jiǎn)單的錯(cuò)誤碼。因?yàn)檫@個(gè)相應(yīng)并沒(méi)有進(jìn)攔截器,更沒(méi)有進(jìn)到Controller層。可我在解決這個(gè)問(wèn)題時(shí),質(zhì)詢了很多朋友不解,百度各種方案無(wú)效。苦苦耗費(fèi)我大半天時(shí)間。
首先,遇到400問(wèn)題,最大幾率是出現(xiàn)了數(shù)據(jù)類(lèi)型不一致的問(wèn)題,簡(jiǎn)單來(lái)說(shuō)是Controller層不用正確讀取你發(fā)送請(qǐng)求附帶的參數(shù)。該例是我前端傳送JSON格式,使用postmen接收。
一.發(fā)現(xiàn)400錯(cuò)誤的,第一步確認(rèn)postmen中發(fā)送的數(shù)據(jù)類(lèi)型是json。比如Headers中Content-Type類(lèi)型是application/json;或是前端代碼Ajax中添加:contentType: ‘application/json;charset=UTF-8’(如圖);
二.第一步確認(rèn)postmen中發(fā)送的數(shù)據(jù)格式是否正確。postmen中經(jīng)常有人有漏寫(xiě)一對(duì)“{}“或是缺少逗號(hào),引號(hào),冒號(hào)的小問(wèn),好在postmen會(huì)自動(dòng)報(bào)錯(cuò)提示; 而在前端中你必須重新包裝傳入?yún)?shù)為JSON型。使用JSON.stringify(params)將params參數(shù)重新包裝;
三.正常解決以上兩個(gè)問(wèn)題,多數(shù)人錯(cuò)誤也該解決了。如果還沒(méi)有,我們就要在Controller接收處查找問(wèn)題。
順帶一說(shuō):前端用json傳入,后端如果用對(duì)象接收,及時(shí)傳入變量名與該對(duì)象的屬性名對(duì)應(yīng)上,也不會(huì)自動(dòng)封裝進(jìn)去,當(dāng)然也不會(huì)直接報(bào)錯(cuò)。如果想json型自動(dòng)轉(zhuǎn)換成對(duì)象,需要在對(duì)象前面添加@RequestBody注解。它會(huì)將JSON進(jìn)行轉(zhuǎn)換成為你指定的對(duì)象。
但是我個(gè)人更喜歡用JSONObeject或Strng去接受,在用手動(dòng)將它轉(zhuǎn)化為我需要的對(duì)象,因?yàn)槲覀魅氲膶?duì)象可能是嵌套好的,其中有一個(gè)對(duì)象,還有其他對(duì)象的List。在頭部自動(dòng)轉(zhuǎn)化就會(huì)出現(xiàn)一些問(wèn)題。
言歸正傳,第三個(gè)可能出現(xiàn)400的問(wèn)題就在這。使用RequestBody轉(zhuǎn)化成String時(shí),意外報(bào)錯(cuò),類(lèi)型不匹配。這一點(diǎn)也是我萬(wàn)萬(wàn)沒(méi)想到的。因?yàn)橹耙粋€(gè)項(xiàng)目基本都是用String在接收前端的JSONO對(duì)象。這次卻卡在400處。解決的方案很簡(jiǎn)單,使用JSONObject原原本本的接收J(rèn)SON對(duì)象!直接使用!可正常情況String接收也是可以的,這點(diǎn)讓我很費(fèi)解,花了不少時(shí)間也沒(méi)能找到原因。可能是注解的配置問(wèn)題,又或者是因?yàn)槭褂肧SM和springBoot框架的差異。
在此也希望得到大神網(wǎng)友的解惑!
總結(jié)
- 上一篇: linux 离线安装mysql_Linu
- 下一篇: Linux的hexdump工具用来做什么