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