使用CXF调用Webservice接口添加SoapHeader

2023-01-12 15:11:49 浏览数 (1)

WebService是啥:

WebService是一种跨编程语言和跨操作系统平台的远程调用技术。

服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!指服务端程序和客户端程序可以在不同的操作系统上运行。

XML XSD,SOAP和WSDL就是构成WebService平台的三大技术。

SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。

WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。

CXF是啥:

Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、 XML/ HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种 传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成

soupheader是啥:

在Web Services方法进行通信使用SOAP遵循标准的SOAP格式,该格式的一部分是在XML文档中编码的数据。XML文档包含一个Envelope根元素(由必需的Body元素和可选的Header元素构成)。Body元素由特定于消息的数据构成。可选的Header元素可以包含不与特定消息直接相关的其他信息。

需要添加的soapheader
代码语言:html复制
 <soapenv:Header>
     <tns:RequestSOAPHeader xmlns:tns="http://sys.webservice.client">
       <tns:user xmlns="http://sys.webservice.client">username</tns:user>
       <tns:password xmlns="http://sys.webservice.client">password</tns:password>
     </tns:RequestSOAPHeader>
   </soapenv:Header>
编码:
代码语言:txt复制
 JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
        jaxWsProxyFactoryBean.getOutInterceptors().add(new AddSoapHeader());
        //jaxWsProxyFactoryBean.setUsername("root");
        //jaxWsProxyFactoryBean.setPassword("***");
        //List<Interceptor<? extends Message>> clientAuthValidateInterceptors = new ArrayList<>();
        // 添加soap header 信息
        // 注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发
        //clientAuthValidateInterceptors.add(new AddSoapHeader());
        //jaxWsProxyFactoryBean.setOutInterceptors(clientAuthValidateInterceptors);
        jaxWsProxyFactoryBean.setServiceClass(ISysNewsToRMTWebService.class);
        jaxWsProxyFactoryBean.setAddress("http://***:8080/sys/webService?wsdl");
        ISysNewsService service = (ISysNewsService)jaxWsProxyFactoryBean.create();
        SysNewsForm form = RequestForm.getNoNullForm();
        try {
            service.findTemplateList(form);
        } catch (Throwable e) {
            System.out.println(e.getMessage());
            throw new RuntimeException(e);
        }
    }
    
代码语言:java复制
import java.util.List;
import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class AddSoapHeader extends AbstractSoapInterceptor {
    public static final String xml_namespaceURI = "http://sys.webservice.client";
    public static final String xml_header = "soapenv:Header";
    public static final String xml_request_header = "tns:RequestSOAPHeader";
    public static final String xml_username = "tns:user";
    public static final String xml_password = "tns:password";

    public AddSoapHeader() {
        // 定义拦截器阶段
        super(Phase.WRITE);
    }

    /**
     * @Description: 拦截器操作
     * @param message
     *            被拦截到的消息
     * @throws Fault
     */
    @Override
    public void handleMessage(SoapMessage message) {

        String userId = "";
        String 密码 = "";

        Document doc = DOMUtils.createDocument();
        Element root = doc.createElement(xml_header);

        Element eUserId = doc.createElement(xml_username);
        eUserId.setTextContent(userId);
        eUserId.setAttribute("xmlns",xml_namespaceURI);
        Element ePwd = doc.createElement(xml_password);
        ePwd.setAttribute("xmlns",xml_namespaceURI);
        ePwd.setTextContent(password);
        Element child = doc.createElement(xml_request_header);
        child.setAttribute("xmlns:tns",xml_namespaceURI);

        child.appendChild(eUserId);
        child.appendChild(ePwd);
        
        root.appendChild(child);
        QName qname = new QName("RequestSOAPHeader");
        SoapHeader head = new SoapHeader(qname, root);
        List<Header> headers = message.getHeaders();
        headers.add(head);
    }
}

0 人点赞