1. 程式人生 > 實用技巧 >請求返回 org.springframework.http.converter.HttpMessageNotReadableException

請求返回 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、我用多種方式 驗證自己介面的正確性,但 要 驗證別人的 錯誤,口頭說有時並不能讓對方意識到問題。