【发布时间】:2021-05-20 15:47:28
【问题描述】:
我正在尝试使用 camel-http4 调用 SOAP 服务。此服务要求我发送以下标头:Content-Type: application/soap+xml;charset=UTF-8;action="ListBerichten"。我必须包含引号,否则服务将返回 400 代码
当我使用 Postman 或 SoapUI 或 curl 等客户端尝试此操作时,它工作正常,但当我使用 Camel 尝试此操作时,它无法识别“动作”。
(卷曲标题看起来像这样)
--header 'Content-Type: application/soap+xml;charset=UTF-8;action="ListBerichten"'
我怀疑它与 ListBerichten 周围的引号有关,但我无法弄清楚它是什么。
我的骆驼路线(我正在使用自定义的 http4 实现进行 SSL 配置):
from("direct:d.receive.{{name}}.listberichten").routeId("ReceiveListBerichten")
.to("xslt:file:{{xslt.cdm.to.target.listberichten}}?saxon=true")
.setHeader(Exchange.HTTP_METHOD).simple("POST")
.setHeader("Content-Type").simple("{{soap.contentType.listberichten}}")
.to("mTlsHttpComponent://{{request.url}}/{{request.url.path}}?useSystemProperties=true&throwExceptionOnFailure=true").id("Receive3")
;
和我的财产
xslt.cdm.to.target.listberichten=\/data\/resources\/...
soap.contentType.listberichten=application/soap+xml;charset=UTF-8;action="ListBerichten"
request.url=...
request.url.path=...
logging.show.info=showAll=true
我得到的回应是:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Sender</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="nl">Err: Unknown SOAPAction:</soap:Text>
</soap:Reason>
</soap:Fault>
</soap:Body>
</soap:Envelope>
我尝试用反斜杠转义引号,用 UTF-8 编码字符替换引号,将标头设置为字符串文字并将“操作”设置在单独的标头中,但似乎没有任何效果。 Content-Type header中的引号需要怎么处理?
【问题讨论】:
-
application/soap+xml;charset=UTF-8;action="ListBerichten"是属性文件中的有效值,不需要转义。 camel-http4 可能正在使用Properties类来读取文件,因此它应该没有问题。你确定引号是问题吗?也许还有其他事情不对劲。由于您已经在使用 SoapUI,请尝试通过其 HTTP 监视器发送您的请求并查看在线发送的内容:soapui.org/docs/http-recording/reference/http-monitor -
一般来说,soap 动作是作为一个名为“SOAPAction”的单独 http 头而不是在“Content-Type”头中传递的。好的,它没有解释为什么它适用于 curl,但这可能是一种解决方法。
-
@TacheDeChoco:上面的 SOAP 错误中的命名空间是 SOAP 1.2 的命名空间,它要求对内容类型执行操作。 SOAPAction 单独的标头用于 SOAP 1.1。
-
首先尝试使用硬编码的标头可能很有用:
.setHeader("Content-Type").constant("application/soap+xml;charset=UTF-8;action=\"ListBerichten\"")以了解根本原因 -
@Bogdan 感谢您的帮助。我截获了 HTTP 流量,但这给出了相同的标头。所以我开始深入研究 http4 组件,发现它在发出 http 请求之前使用了 org.apache.http.message.TokenParser,它从soap 动作中删除了引号。我切换到 camel-netty-http4 组件,这很有效。
标签: java soap https apache-camel content-type