一、問題由來
最近在和前端調試一個自己寫的接口時,頻頻出現問題,讓我很是煩惱。因此寫下這篇博文來記錄開發中遇到的一些問題。第一個問題是
前端頁面傳遞參數后,后台不能正常接收參數。我寫好接口以后,通過swagger測試,發現沒問題,然后就和前端進行調試,可是前端進
行調試時頻頻出錯。Controller的代碼如下,
使用Swagger工具調試接口時,也沒有問題。因為文件是存放在測試環境上面的,所以報了一個文件不存在是正確的。
可問題是前端測試時報的確實另外一個錯,文件ID不存在,這個錯誤也是自己主動拋出的異常。這就很尷尬了。
二、問題分析
經過反復的排查,發現有一個地方存在問題,那就是參數的傳遞方式不一樣。前端開發人員傳遞參數時的方式是Request Payload,而我在使用Swagger測試時
傳遞參數的方式為Form Data。因為這一不同導致了BUG的出現,問題找到了,我想應該會比較好解決。
三、解決方案
發現這個問題,我立馬和前端人員協商,看看是他修改還是我修改。去看了之前已經做好的一些功能,想看看使用Post請求傳遞參數的方式是什么。
結果發現也是Request Payload這種方式,Controller中也是使用PostMapping。接着我開始修改后台代碼,修改后的代碼如下,
使用Swagger測試情況如下,測試正常。部署到測試服務器時,數據也正確返回了。
我本以為現在應該沒問題了,測試也正常了。可是前端測試人員給我反饋,還是不行沒有數據返回,返回的錯誤信息是沒有沒有查詢到文件。
我讓他把傳遞的參數單獨發給我,我直接去數據庫中查詢,發現有數據,這就奇了怪了。
為什么我在本地測試時,查詢沒問題,前端人員使用前端項目訪問時就出問題呢?只得繼續排查。讓前端人員調試時直接連接我的后台,打斷點進行調試。
這是發現問題:使用這種方式,public ResponseEntity<JsonResult<String>> previewExcel(@RequestBody String fileId){}接收到的參數不是我
想要的,接收到的fileId的值為: "fileid:'379ecdefeed5468c845f1984fc26f78c'",就相當於把傳遞進來的整個JSON數據映射到fileId上了,而並不是僅僅是后
面的值。確定這個問題后,我修改了代碼將@RequestBody后面的單個變量修改為一個參數輸入的類如下。
然后再次調試,結果如下。變化是參數的傳遞方式還是Request Payload,但是里面的參數變為JSON格式的數據了。然后將代碼部署到測試環境,前端人員測試時正確,問題解決。
以前開發時,還真沒有注意這些細節問題。Controller中使用不同的注解,傳遞參數的方式也會不一樣。同時也對於@RequestBody注解有了更深刻的理解。
這個注解是將Post請求中的JSON數據映射到一個類中,不能單獨映射到某個字段中,即使是單個字段最好也是使用請求輸入類來接收收據。吃一塹,長一智,
通過這次采坑,又學習到不少東西。