120 同样的 url, header, 参数, 使用 OkHttp 能够成功获取数据, 使用 RestTemplate 报错

前言

这个问题主要是来自于 实际生活中碰到的一个问题

这里 主要是记录一下

主要是 访问一个 http 服务, 使用 RestTemplate 拿500的响应, 然后使用 OkHttp 可以正常拿到数据

这里 就是来复现一下 这个问题, 并梳理一下

测试用例

http 服务这边的处理如下, 处理也非常简单, 就是 每一秒输出一行内容, 然后持续 5秒

使用 RestTemplate 发送请求 示例代码如下

执行结果如下

使用 OkHttp 发送请求 示例代码如下

执行结果如下

两种发送请求方式的差异

当然 从服务器这边的代码来看, 一眼就能够看出差异

可能就是 这个 accept 的请求头了

然后 我们实际来调试一下

RestTemplate 发送请求服务器这边拿到的请求如下

可以看到 accept 的请求头, 虽然这里是为空

但是在实际的 spring-boot 项目中, 这里 一般不会为空, 可能是 "application/json" 之类的

OkHttp 发送请求服务器这边拿到的请求如下

可以看到 这边是没有 accept 的请求头的

因此 使用这二者的差异就在于 RestTemplate 这边发送请求的时候, 根据了响应类型生成了一个 Accept 请求头, 然后 OkHttp 这边没有自动生成这个 Accept 请求头

然后 对方服务器可能基于这个 Accept 请求头做了不同的处理, 因此 产生了差异

一般情况下在 RestTemplate 的使用场景下设置 responseType 为 String.class 应该能够解决问题

Rest Template 设置 Accept 请求头的地方

这里是 RestTemplate 指定了 responseType, RestTemplate 这边就会为其设置 Accept 请求头

如果 converter 没有匹配的类型, 设置为 空 或者 目标类型

500 : no body 的文字信息来自于哪里?

错误信息来自于 DefaultResponseErrorHandler.getErrorMessage

DefaultResponseErrorHandler.getErrorMessage 的处理如下

完

相关推荐
最强小杰41 分钟前
minimax-m3 突然报 HTTP 529 怎么办?连续重试为何更难恢复,退避时间该怎么算?
网络·网络协议·http·ai
Thanks_ks2 小时前
常见 HTTP 状态码的坑:301/302、401/403、500/502 之间差的那一个词
计算机网络·nginx·http·面试·状态码·后端开发·浏览器缓存
Thanks_ks3 小时前
Cookie 和 Session 到底是什么关系——登录态是怎么维持的
分布式·http·jwt·cookie·session·后端开发·登录态
QianhangQianping3 小时前
WebSocket实时推送+ HTTP 定时轮询:一块大屏两套取数怎么不打架
前端·websocket·网络协议·http·低代码·架构·数据可视化
嵌入式学习菌1 天前
HTTP/HTTPS、MQTT/MQTTS 区别
网络协议·http·https
情 九2 天前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
步行cgn2 天前
HTTP 请求报文结构详解:请求行、请求头、请求体各自的作用
网络·网络协议·http
明天也要努力学习3 天前
HTTP 协议的基本格式和 fiddler 的用法
网络协议·http·fiddler
cpolar技术支持3 天前
网关加 gzip,同时开启 chunked,下载回来的包解不开:把两层编码的解压顺序与长度核对做成只读页
python·http·网络编程·socket·内网穿透
骑着蜗牛撵大象3273 天前
手写一个 HTTP 服务器:从 socket 到 epoll,Linux 上到底怎么把请求变成响应
linux·服务器·网络·http·epoll·socket编程·并发模型