camel cxf客户端请求中的http header Content-Length
Http header Content-Length in camel cxf client request
我们有一条简单的骆驼路线"from->to":
<from uri="cxf:bean:testServiceProvider?loggingFeatureEnabled=true" />
<to uri="cxf:bean:testServiceClient?loggingFeatureEnabled=true" />
此路由充当第三方网络服务的路由器或代理:
- 客户端将其用作端点。
- 将 WSS header 添加到 Soap 消息。
- 将请求路由到真实端点。
此代理中的服务和客户端是使用 cxf
个 bean 创建的。
端点的 Web 服务似乎需要 Content-Length
HTTP header,但默认情况下 cxf
对端点的请求不包含此 header。此代理完成的所有请求都会收到相同的响应:
HTTP response '411: Length required' when communicating with https://host:port/testService
我们尝试使用 OutInterceptor 添加此 header,将其添加到 PROTOCOL_HEADERS:
Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS);
headers.put("Content-Length", Collections.singletonList(String.valueOf(messageLength)));
两个问题:
如何知道messageLength
的值?
有更简单的方法吗?
谢谢!
查看 CXF 文档,您可以使用 relayHeaders 功能将 headers 从 "from" 端点传播到 "to" 端点。
或者,您可以按照此处的建议从入站消息中复制 content-length 的值...
"如果你想在老版本的camel中保留那些header,你需要
将 header 放入地图并将该地图放入消息 header 中
键 "org.apache.cxf.message.PROTOCOL_HEADERS"."
您可以尝试 http:conduit,禁用 AllowChunking。这将强制 cxf 在请求中包含 Content-Length header。默认情况下,cxf 行为是允许分块的,因此它可能会产生您面临的问题,甚至指定 Content-length header.
<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>
我们有一条简单的骆驼路线"from->to":
<from uri="cxf:bean:testServiceProvider?loggingFeatureEnabled=true" />
<to uri="cxf:bean:testServiceClient?loggingFeatureEnabled=true" />
此路由充当第三方网络服务的路由器或代理:
- 客户端将其用作端点。
- 将 WSS header 添加到 Soap 消息。
- 将请求路由到真实端点。
此代理中的服务和客户端是使用 cxf
个 bean 创建的。
端点的 Web 服务似乎需要 Content-Length
HTTP header,但默认情况下 cxf
对端点的请求不包含此 header。此代理完成的所有请求都会收到相同的响应:
HTTP response '411: Length required' when communicating with https://host:port/testService
我们尝试使用 OutInterceptor 添加此 header,将其添加到 PROTOCOL_HEADERS:
Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS);
headers.put("Content-Length", Collections.singletonList(String.valueOf(messageLength)));
两个问题:
如何知道messageLength
的值?
有更简单的方法吗?
谢谢!
查看 CXF 文档,您可以使用 relayHeaders 功能将 headers 从 "from" 端点传播到 "to" 端点。
或者,您可以按照此处的建议从入站消息中复制 content-length 的值...
"如果你想在老版本的camel中保留那些header,你需要 将 header 放入地图并将该地图放入消息 header 中 键 "org.apache.cxf.message.PROTOCOL_HEADERS"."
您可以尝试 http:conduit,禁用 AllowChunking。这将强制 cxf 在请求中包含 Content-Length header。默认情况下,cxf 行为是允许分块的,因此它可能会产生您面临的问题,甚至指定 Content-length header.
<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>