如何从 Camel 中的交换 object 检索 SOAP header?
How to retrieve the SOAP header from exchange object in Camel?
- 我们公开了一个 Apache camel-cxf 网络服务。使用 camel 处理器,我们正在尝试从 soapUi 客户端获取我们在 soap 请求中传递的 soap header。
交换 object 包含 soap 消息的 body(不是 soap header)。在 exchange.getIn.getHeader() 中,我们只得到我们传递的 HTTP Headers,而不是 SOAP Header.
如何从 Camel 中的交换对象中检索 SOAP header?
以下是肥皂 header 通过:
<soapenv:Header>
<ns1:info xmlns:ns1="http://www.w3schools.com/transaction/">
<ns1:TransactionID>01</ns1:TransactionID>
<ns1:AppUserID>52</ns1:AppUserID>
<ns1:AppPass>ab</ns1:AppPass>
</ns1:info>
</soapenv:Header>
我们尝试使用,
- exchange.getIn().getHeaders();
exchange.getIn().getHeader(“交易ID”);
但是无法提取已发送的 SOAP header。
- 如何在负载模式下添加自定义 soap header?
如果 cxf 端点配置为在 DataFormat.PAYLOAD 中工作,那么:
.process(exchange -> {
CxfPayload body = exchange.getIn().getBody(CxfPayload.class);
for (Object header : body.getHeaders()) {
SoapHeader soapHeader = (SoapHeader) header;
org.w3c.dom.Element element = (Element) soapHeader.getObject();
//parse elements
}
});
如果在原始模式下,只需使用 xpath
读取输入流并将数据解析为 xml
更新:
示例路线:
CxfEndpoint endpoint = new CxfEndpoint();
endpoint.setDataFormat(DataFormat.PAYLOAD);
endpoint.setWsdlURL("etc/Proxy.wsdl");
endpoint.setAddress("http://localhost:8089/wsservice/");
getContext().getRegistry().bind("cxfend", endpoint);
from("cxf:bean:cxfend")
.process(exchange -> {
CxfPayload body = exchange.getIn().getBody(CxfPayload.class);
for (Object header : body.getHeaders()) {
SoapHeader soapHeader = (SoapHeader) header;
org.w3c.dom.Element element = (Element) soapHeader.getObject();
Element transactionID = (Element) element.getElementsByTagName("ns1:TransactionID").item(0);
log.info("Header TransactionID with value:{}", transactionID.getTextContent());
}
});
输出:
2020-03-03 11:43:03,327 [main ] INFO Server
- jetty-9.4.21.v20190926; built: 2019-09-26T16:41:09.154Z; git:
72970db61a2904371e1218a95a3bef5d79788c33; jvm 1.8.0_232-b18
2020-03-03 11:43:03,377 [main ] INFO AbstractConnector
- Started ServerConnector@b016b4e{HTTP/1.1,[http/1.1]}{localhost:8089}
2020-03-03 11:43:03,377 [main ] INFO Server
- Started @3403ms
2020-03-03 11:43:03,400 [main ] INFO ContextHandler
- Started o.e.j.s.h.ContextHandler@1b15f922{/wsservice,null,AVAILABLE}
2020-03-03 11:43:03,400 [main ] INFO DefaultCamelContext
- Route: route1 started and consuming from: cxf://bean:cxfend
2020-03-03 11:43:03,406 [main ] INFO DefaultCamelContext
- Total 1 routes, of which 1 are started
2020-03-03 11:43:03,408 [main ] INFO DefaultCamelContext
- Apache Camel 3.0.1 (CamelContext: camel-1) started in 1.953 seconds
2020-03-03 11:43:10,068 [tp1299661385-22] INFO TypeUtil
- JVM Runtime does not support Modules
2020-03-03 11:43:10,196 [tp1299661385-22] INFO RouteTest
- Header TransactionID with value:01
那是我的解决方案:
List<SoapHeader> soapHeaders = (List)exchange.getIn().getHeader("org.apache.cxf.headers.Header.list");
Element header = ((Element)soapHeaders.get(0).getObject());
String eventType = (String)header.getElementsByTagName("TransactionID").item(0).getTextContent();
exchange.getIn().setHeader("TYPE_EVENT",eventType);
- 我们公开了一个 Apache camel-cxf 网络服务。使用 camel 处理器,我们正在尝试从 soapUi 客户端获取我们在 soap 请求中传递的 soap header。
交换 object 包含 soap 消息的 body(不是 soap header)。在 exchange.getIn.getHeader() 中,我们只得到我们传递的 HTTP Headers,而不是 SOAP Header.
如何从 Camel 中的交换对象中检索 SOAP header?
以下是肥皂 header 通过:
<soapenv:Header>
<ns1:info xmlns:ns1="http://www.w3schools.com/transaction/">
<ns1:TransactionID>01</ns1:TransactionID>
<ns1:AppUserID>52</ns1:AppUserID>
<ns1:AppPass>ab</ns1:AppPass>
</ns1:info>
</soapenv:Header>
我们尝试使用,
- exchange.getIn().getHeaders();
exchange.getIn().getHeader(“交易ID”);
但是无法提取已发送的 SOAP header。
- 如何在负载模式下添加自定义 soap header?
如果 cxf 端点配置为在 DataFormat.PAYLOAD 中工作,那么:
.process(exchange -> {
CxfPayload body = exchange.getIn().getBody(CxfPayload.class);
for (Object header : body.getHeaders()) {
SoapHeader soapHeader = (SoapHeader) header;
org.w3c.dom.Element element = (Element) soapHeader.getObject();
//parse elements
}
});
如果在原始模式下,只需使用 xpath
读取输入流并将数据解析为 xml更新:
示例路线:
CxfEndpoint endpoint = new CxfEndpoint();
endpoint.setDataFormat(DataFormat.PAYLOAD);
endpoint.setWsdlURL("etc/Proxy.wsdl");
endpoint.setAddress("http://localhost:8089/wsservice/");
getContext().getRegistry().bind("cxfend", endpoint);
from("cxf:bean:cxfend")
.process(exchange -> {
CxfPayload body = exchange.getIn().getBody(CxfPayload.class);
for (Object header : body.getHeaders()) {
SoapHeader soapHeader = (SoapHeader) header;
org.w3c.dom.Element element = (Element) soapHeader.getObject();
Element transactionID = (Element) element.getElementsByTagName("ns1:TransactionID").item(0);
log.info("Header TransactionID with value:{}", transactionID.getTextContent());
}
});
输出:
2020-03-03 11:43:03,327 [main ] INFO Server
- jetty-9.4.21.v20190926; built: 2019-09-26T16:41:09.154Z; git:
72970db61a2904371e1218a95a3bef5d79788c33; jvm 1.8.0_232-b18
2020-03-03 11:43:03,377 [main ] INFO AbstractConnector
- Started ServerConnector@b016b4e{HTTP/1.1,[http/1.1]}{localhost:8089}
2020-03-03 11:43:03,377 [main ] INFO Server
- Started @3403ms
2020-03-03 11:43:03,400 [main ] INFO ContextHandler
- Started o.e.j.s.h.ContextHandler@1b15f922{/wsservice,null,AVAILABLE}
2020-03-03 11:43:03,400 [main ] INFO DefaultCamelContext
- Route: route1 started and consuming from: cxf://bean:cxfend
2020-03-03 11:43:03,406 [main ] INFO DefaultCamelContext
- Total 1 routes, of which 1 are started
2020-03-03 11:43:03,408 [main ] INFO DefaultCamelContext
- Apache Camel 3.0.1 (CamelContext: camel-1) started in 1.953 seconds
2020-03-03 11:43:10,068 [tp1299661385-22] INFO TypeUtil
- JVM Runtime does not support Modules
2020-03-03 11:43:10,196 [tp1299661385-22] INFO RouteTest
- Header TransactionID with value:01
那是我的解决方案:
List<SoapHeader> soapHeaders = (List)exchange.getIn().getHeader("org.apache.cxf.headers.Header.list");
Element header = ((Element)soapHeaders.get(0).getObject());
String eventType = (String)header.getElementsByTagName("TransactionID").item(0).getTextContent();
exchange.getIn().setHeader("TYPE_EVENT",eventType);