springboot 项目请求问题

340 天前
 linjiece543
背景:目前有个 springboot 项目,1.使用了全局异常处理器,返回的是 errorMsg;2.使用了 HttpMessageConveter,功能是 xml2object 和 object2xml,对请求和响应的消息都做了转换
问题:分别使用 apache 的 httpclient 工具和 springweb 的 resttemplate 工具发送相同的 http 请求,正常情况下它们响应的内容都一样,异常情况下 httpclient 响应的内容是异常处理器后的 errorMsg,而 resttemplate 请求拿到的响应内容是在异常处理器处理过后再经过了消息处理器转换后的得到的 xml 报文,可以确认两者的请求处理报文流程完全相同,为啥第一个请求拿到的结果不是经过消息处理器包装的内容?有没有大佬帮忙解答下
1224 次点击
所在节点    程序员
4 条回复
renfei
340 天前
是不是请求头中 Accept 不同?
hulalalla
340 天前
这个问题的原因是,Spring Web 的 RestTemplate 在处理 HTTP 请求时,会先调用 HttpMessageConverter 来将 HTTP 响应转换为对象,然后再调用全局异常处理器来处理异常。而 Apache 的 HttpClient 在处理 HTTP 请求时,只会调用全局异常处理器来处理异常。

所以,在正常情况下,两者都会得到相同的结果。但在异常情况下,RestTemplate 会得到经过消息处理器转换后的结果,而 HttpClient 会得到原始的异常信息。

要解决这个问题,可以为 RestTemplate 设置一个自定义的 HttpMessageConverter ,来将 HTTP 响应转换为你想要的格式。
vagusss
340 天前
建议贴一下代码,看看两种处理 body 的方式是否相同, 或者你直接用 postman 之类的工具调用试试
linjiece543
340 天前
@renfei 谢谢解答,经过调试确实是这个问题,httpclient 没有默认的 accept ,所以在消息转换器的选择时选择到了 StringHttpMessageConverter,没有走到我那个消息转换器

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/962026

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX