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
相关产品推荐
相关产品推荐

