• 请求返回 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、我用多种方式 验证自己接口的正确性,但 要 验证别人的 错误,口头说有时并不能让对方意识到问题。

  • 相关阅读:
    Workbox使用策略
    前端性能指标计算方法
    make源文件时出现 /usr/bin/ld: cannot find -lstdc++ 错误
    mac 支持rz sz
    v8引擎的优化
    pixi与lottie-web的benchmark测试
    alinode与官方node性能测试方法及分析
    2019年RTC大会记录
    后端数据推送-EventSource
    技术选型需要关注的软件开源协议
  • 原文地址:https://www.cnblogs.com/idea-persistence/p/13454554.html
Copyright © 2020-2023  润新知