在camel cxf客户端请求中的Http头Content-Length

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在camel cxf客户端请求中的Http头Content-Length相关的知识,希望对你有一定的参考价值。

我们有一个简单的骆驼路线“从 - >到”:

<from uri="cxf:bean:testServiceProvider?loggingFeatureEnabled=true" />
<to uri="cxf:bean:testServiceClient?loggingFeatureEnabled=true" />

此路由的作用类似于第三方Web服务的路由器或代理:

  • 客户端将其用作端点。
  • 将WSS标头添加到Soap消息。
  • 将请求路由到真实端点。

此代理中的服务和客户端是使用cxf bean创建的。

端点的Web服务似乎需要Content-Length HTTP标头,但默认情况下,cxf对端点的请求不包含此标头。此代理完成的所有请求都会收到相同的响应:

HTTP response '411: Length required' when communicating with https://host:port/testService

我们尝试使用OutInterceptor添加此标头,并将其添加到PROTOCOL_HEADERS:

Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS);
headers.put("Content-Length", Collections.singletonList(String.valueOf(messageLength)));

两个问题:

如何知道messageLength的价值?有更简单的方法吗?

谢谢!

答案

您可以尝试使用http:conduit,禁用AllowChunking。这将强制cxf在请求中包含Content-Length标头。默认情况下,cxf行为是允许分块,因此它可以生成您面临的问题,甚至指定Content-length头。

<http:conduit name="{http://namespace}WebService.http-conduit">
    <http:client AllowChunking="false" CacheControl="No-Cache" 
ContentType="text/xml;charset=UTF-8" ConnectionTimeout="900000" 
ReceiveTimeout="900000" Connection="Keep-Alive" />
</http:conduit>
另一答案

查看CXF文档,您可以使用relayHeaders功能来传播从“from”端点到“to”端点的标头。

CXF Bean Docs

或者,您可以按照此处的建议从入站消息中复制内容长度的值...

“如果你想将这些标题保留在旧版本的camel中,你需要将标题放入一个地图中,然后将这个地图放入带有”org.apache.cxf.message.PROTOCOL_HEADERS“键的邮件标题中。”

Copy headers

以上是关于在camel cxf客户端请求中的Http头Content-Length的主要内容,如果未能解决你的问题,请参考以下文章

CXF & Camel:不支持 List<Object> 作为 Web 服务参数

使用servlet传输Jboss fuse 6.3公开https camel cxf webservice

将 Camel CXF 代理部署到 Red Hat JBoss Fuse

将 CXF 与 Apache Camel 一起使用时,如何设置 WS-Addressing MessageId 标头?

Mark:Camel SQL Route

更新元素列表时,Apache Camel CXF 难以调用 RPC/Encoded WSDL