【问题标题】:Quotation marks in Camel Content-Type headerCamel Content-Type 标头中的引号
【发布时间】: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


【解决方案1】:

action 参数是 SOAP 版本 1.2 中设置 SOAP Action 的默认方式。然而,HTTP 组件解析内容类型值。您可以使用的替代方法:

  1. netty-http 组件(自 Camel 2.14 起)
  2. vertx-http 组件(自 Camel 3.5 起)

两个组件都不解析标头值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2012-07-04
    • 2021-05-20
    • 2021-11-08
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多