我们有一个简单的骆驼路线“from-> to”:
<from uri="cxf:bean:testServiceProvider?loggingFeatureEnabled=true" />
<to uri="cxf:bean:testServiceClient?loggingFeatureEnabled=true" />
此路由的作用类似于第三方Web服务的路由器或代理:
此代理中的服务和客户端是使用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
的价值?
有更简单的方法吗?
谢谢!
答案 0 :(得分:1)
您可以尝试使用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>
答案 1 :(得分:0)
查看CXF文档,您可以使用relayHeaders功能来传播来自&#34;来自&#34;终点到&#34;到&#34;端点。
或者,您可以按此处建议的方式从入站邮件中复制内容长度的值...
&#34;如果你想将这些标题保留在旧版本的camel中,你需要 将标题放入地图并将此地图放入邮件标题中 关键&#34; org.apache.cxf.message.PROTOCOL_HEADERS&#34;。&#34;