V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linjiece543
V2EX  ›  程序员

springboot 项目请求问题

  •  
  •   linjiece543 · 2023-08-03 11:49:23 +08:00 via Android · 1332 次点击
    这是一个创建于 463 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:目前有个 springboot 项目,1.使用了全局异常处理器,返回的是 errorMsg;2.使用了 HttpMessageConveter,功能是 xml2object 和 object2xml,对请求和响应的消息都做了转换
    问题:分别使用 apache 的 httpclient 工具和 springweb 的 resttemplate 工具发送相同的 http 请求,正常情况下它们响应的内容都一样,异常情况下 httpclient 响应的内容是异常处理器后的 errorMsg,而 resttemplate 请求拿到的响应内容是在异常处理器处理过后再经过了消息处理器转换后的得到的 xml 报文,可以确认两者的请求处理报文流程完全相同,为啥第一个请求拿到的结果不是经过消息处理器包装的内容?有没有大佬帮忙解答下
    4 条回复    2023-08-03 15:20:06 +08:00
    renfei
        1
    renfei  
       2023-08-03 11:54:02 +08:00
    是不是请求头中 Accept 不同?
    hulalalla
        2
    hulalalla  
       2023-08-03 13:56:21 +08:00
    这个问题的原因是,Spring Web 的 RestTemplate 在处理 HTTP 请求时,会先调用 HttpMessageConverter 来将 HTTP 响应转换为对象,然后再调用全局异常处理器来处理异常。而 Apache 的 HttpClient 在处理 HTTP 请求时,只会调用全局异常处理器来处理异常。

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

    要解决这个问题,可以为 RestTemplate 设置一个自定义的 HttpMessageConverter ,来将 HTTP 响应转换为你想要的格式。
    vagusss
        3
    vagusss  
       2023-08-03 14:08:01 +08:00
    建议贴一下代码,看看两种处理 body 的方式是否相同, 或者你直接用 postman 之类的工具调用试试
    linjiece543
        4
    linjiece543  
    OP
       2023-08-03 15:20:06 +08:00 via Android
    @renfei 谢谢解答,经过调试确实是这个问题,httpclient 没有默认的 accept ,所以在消息转换器的选择时选择到了 StringHttpMessageConverter,没有走到我那个消息转换器
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   966 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 22:18 · PVG 06:18 · LAX 14:18 · JFK 17:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.