You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SoapUI与Spring Boot调用同SOAP服务返回不同状态码问题排查

问题:SOAP服务调用返回202状态码且响应体为空,SoapUI正常但Java代码异常

场景描述

在SoapUI中调用某SOAP服务可获得200状态码的正常响应,但使用Spring Boot 2.7.3的Java代码以POST方式发送完全相同的XML请求体时,却返回202状态码,且响应体为空。

请求XML内容

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tot="http://www.totalbody.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <tot:RealizarConsultaSQL>
         <!--Optional:-->
         <tot:codSentenca>Tech.001</tot:codSentenca>
         <!--Optional:-->
         <tot:codColigada>1</tot:codColigada>
         <!--Optional:-->
         <tot:codSistema>P</tot:codSistema>
         <!--Optional:-->
         <tot:parameters>CHAPA=01803-3</tot:parameters>
      </tot:RealizarConsultaSQL>
   </soapenv:Body>
</soapenv:Envelope>

初始Java请求代码

request = HttpRequest.newBuilder()                  
        .uri(new URI(this.soapTotvs))
        .header(TAG_CONTENT_TYPE, VALUE_CONTENT_TYPE_XML)                   
        .header("Authorization", getBasicAuthenticationHeader(username, password))
        .header("Accept", "application/xml")
        .POST(HttpRequest.BodyPublishers.ofString(xmlSoap))
        .version(HttpClient.Version.HTTP_2)
        .timeout(Duration.ofSeconds(1200))
        .build();

HttpClient client = HttpClient.newBuilder()
        .connectTimeout(Duration.ofSeconds(1200))
        .followRedirects(Redirect.NORMAL)                   
        .build();

CompletableFuture<HttpResponse<String>> responseFuture = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());           
responseFuture.thenAccept(response -> {
    log.info("code.....: " + response.statusCode()); // 始终返回202
    log.info("body.....: " + response.body()); // 响应体为空
    log.info("headers..: " + response.headers().map()); // {content-length=[0], date=[Tue, 07 Nov 2023 11:51:44 GMT], server=[Microsoft-HTTPAPI/2.0]}           
});                 
HttpResponse<String> result = responseFuture.join();
log.info("body returned..: " + result.body());          

问题现象

  • 接口始终返回202状态码
  • 响应体为空字符串
  • 响应头仅包含content-length:0、date和server字段

解决方法

补充必要的请求头,尤其是SOAPAction头(SOAP服务识别请求的关键标识),同时添加Accept-Encoding、User-Agent等头信息,让请求格式与SoapUI的请求对齐。

修改后的Java请求代码

request = HttpRequest.newBuilder()
    .uri(new URI(this.soapTotvs))
    .header(TAG_CONTENT_TYPE, VALUE_CONTENT_TYPE_XML)
    .header("Authorization", authorization)
    .header("Accept-Encoding", "gzip,deflate")
    .header("User-Agent", "Apache-HttpClient/4.5.5 (Java/16.0.2)")
    .header("Accept", "application/xml")
    .header("SOAPAction", soapAction) // 之前遗漏了这个关键头
    .POST(HttpRequest.BodyPublishers.ofString(xmlSoap))
    .version(HttpClient.Version.HTTP_2)
    .timeout(Duration.ofSeconds(1200)).build();

内容的提问来源于stack exchange,提问作者Francisco Souza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:12:35