简体   繁体   English

如何从骆驼的交换对象中检索 SOAP 标头?

[英]How to retrieve the SOAP header from exchange object in Camel?

  • We exposed an Apache camel-cxf webservice.我们公开了一个 Apache camel-cxf 网络服务。 Using camel processor we are trying to get the soap header that we passed in the soap request from the soapUi client.使用骆驼处理器,我们试图从soapUi 客户端获取我们在soap 请求中传递的soap 标头。
  • The exchange object contains the body of soap message(not soap header).交换对象包含soap消息的主体(不是soap头)。 In the exchange.getIn.getHeader() we are only getting the HTTP Headers we passed, not the SOAP Header.在 exchange.getIn.getHeader() 中,我们只获取我们传递的 HTTP 标头,而不是 SOAP 标头。

  • How to retrieve the SOAP header from exchange obeject in Camel ?如何从 Camel 中的交换对象检索 SOAP 标头?

  • Following are the soap header passed:以下是传递的肥皂头:

 <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>

  • We tried using,我们尝试使用,

    • exchange.getIn().getHeaders(); exchange.getIn().getHeaders();
    • exchange.getIn().getHeader(“TransactionID”); exchange.getIn().getHeader(“TransactionID”);

      However it was not able to extract the SOAP header which was sent.但是,它无法提取发送的 SOAP 标头。

  • How to add custom soap headers in Payload mode ?如何在有效负载模式下添加自定义肥皂头?

If cxf endpoint configured to working in DataFormat.PAYLOAD so:如果 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
                }
            });

If in raw mode, just read input stream and parsing data as xml using xpath如果处于原始模式,只需使用 xpath 读取输入流并将数据解析为 xml

UPD:更新:

Example route:示例路线:

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());
                }
            });

Output:输出:

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

That was my solution:那是我的解决方案:

    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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM