請求返回 org.springframework.http.converter.HttpMessageNotReadableException
1 、背景
提供一個介面給三方,都已經用postman 測試完畢。 等到 對方 跨城市 進行 api 對接測試的時候 ,直接 報了異常。
2、異常
2.1
{"success":false,"ret":500,"code":"SYSTEM_ERROR","msg":"系統異常,請聯絡管理員!","data":"org.springframework.web.HttpMediaTypeNotSupportedException"}
傳的資料 型別有問題,我定義的是 json, 對方傳的是 表單
2.2
{
"success": false,
"ret": 500,
"code": "SYSTEM_ERROR",
"msg": "系統異常,請聯絡管理員!",
"data": "org.springframework.http.converter.HttpMessageNotReadableException"
}
這個問題 查了好久,我自己postman 可以,對方就不行。
其實已經很明顯的是 body的問題
方案一:
我讓對方用 postman 先測試下,
居然說還是返回 相同的異常。
我猜想是不是 header引數問題,postman上我自己加的引數就這幾個, 我想是不是 postman
自帶的引數有什麼問題,一個一個嘗試,發現 只有 content-Length 打勾的時候,才正常, 最接近的一篇文章header引數Content-length引發的問題—http長連線的理解
難道還要加這引數?? 不科學,平常請求的時候怎麼會有這麼多引數, 我把他轉成 curl 命令 檢視,
發現 其實 也就 幾個引數,並且執行 都能成功。
(猜想 postman 自帶的那些引數是 postman自己做了驗證)
線上的 http 測試做了驗證,也是ok的。 真不知道什麼情況。
方案二:
自己寫 client 進行測試,
RestTemplate restTemplate = new RestTemplate();
String url = "http://127.0.0.1:8081/xxxxx";
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("header1", param1);
headers.add("header2", param2);
headers.add("header3", param3);
Map<String,Object> map = new HashMap<>();
map.put("body1", "value");
HttpEntity request = new HttpEntity(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);
System.out.println(response);
<200,{"success":true,"ret":0,"code":"SUCCESS","msg":"success","data":{"value":"2222"}},[Server:"openresty/1.15.8.2", Date:"Fri, 07 Aug 2020 07:38:33 GMT", Content-Type:"application/json;charset=UTF-8", Transfer-Encoding:"chunked", Connection:"keep-alive"]>
都能正常訪問,對方為什麼不行呢? 問題出在對方,但是 不知道對方的問題在哪?
方案三: 打印出 對方的body 請求,已事實說話
列印 body 會存在問題,request.getInputStream() 獲取一次後,後面就失效了。 可以參考
spring boot攔截器中獲取request post請求中的引數,通過 extends HttpServletRequestWrapper 實現 包裝一層。
對方的 body:
正確的body格式:
總結
1、這個問題 還是很鬱悶的,對方測試一直有這問題,他不知道哪裡問題
2、我用多種方式 驗證自己介面的正確性,但 要 驗證別人的 錯誤,口頭說有時並不能讓對方意識到問題。