• 请不要在回答技术问题时复制粘贴 AI 生成的内容
linjiece543
V2EX  ›  程序员

springboot 项目请求问题

  •  
  •   linjiece543 · Aug 3, 2023 via Android · 2163 views
    This topic created in 1015 days ago, the information mentioned may be changed or developed.
    背景:目前有个 springboot 项目,1.使用了全局异常处理器,返回的是 errorMsg;2.使用了 HttpMessageConveter,功能是 xml2object 和 object2xml,对请求和响应的消息都做了转换
    问题:分别使用 apache 的 httpclient 工具和 springweb 的 resttemplate 工具发送相同的 http 请求,正常情况下它们响应的内容都一样,异常情况下 httpclient 响应的内容是异常处理器后的 errorMsg,而 resttemplate 请求拿到的响应内容是在异常处理器处理过后再经过了消息处理器转换后的得到的 xml 报文,可以确认两者的请求处理报文流程完全相同,为啥第一个请求拿到的结果不是经过消息处理器包装的内容?有没有大佬帮忙解答下
    4 replies    2023-08-03 15:20:06 +08:00
    renfei
        1
    renfei  
       Aug 3, 2023
    是不是请求头中 Accept 不同?
    hulalalla
        2
    hulalalla  
       Aug 3, 2023
    这个问题的原因是,Spring Web 的 RestTemplate 在处理 HTTP 请求时,会先调用 HttpMessageConverter 来将 HTTP 响应转换为对象,然后再调用全局异常处理器来处理异常。而 Apache 的 HttpClient 在处理 HTTP 请求时,只会调用全局异常处理器来处理异常。

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

    要解决这个问题,可以为 RestTemplate 设置一个自定义的 HttpMessageConverter ,来将 HTTP 响应转换为你想要的格式。
    vagusss
        3
    vagusss  
       Aug 3, 2023
    建议贴一下代码,看看两种处理 body 的方式是否相同, 或者你直接用 postman 之类的工具调用试试
    linjiece543
        4
    linjiece543  
    OP
       Aug 3, 2023 via Android
    @renfei 谢谢解答,经过调试确实是这个问题,httpclient 没有默认的 accept ,所以在消息转换器的选择时选择到了 StringHttpMessageConverter,没有走到我那个消息转换器
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1147 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 23:05 · PVG 07:05 · LAX 16:05 · JFK 19:05
    ♥ Do have faith in what you're doing.