使用CXF调用Webservice接口添加SoapHeader

简介: 使用CXF调用Webservice接口添加SoapHeader

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

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

编码:

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


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);
    }
}
相关文章
|
4月前
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
|
29天前
【Azure App Service】PowerShell脚本批量添加IP地址到Web App允许访问IP列表中
Web App取消公网访问后,只允许特定IP能访问Web App。需要写一下段PowerShell脚本,批量添加IP到Web App的允许访问IP列表里!
|
2月前
|
XML 前端开发 Java
JAVA调试webservice接口
JAVA调试webservice接口
24 0
|
4月前
|
关系型数据库 MySQL Linux
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
|
4月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
4月前
|
Linux 应用服务中间件 网络安全
【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
|
4月前
【Azure 应用服务】通过 Web.config 开启 dotnet 应用的 stdoutLog 日志,查看App Service 产生500错误的原因
【Azure 应用服务】通过 Web.config 开启 dotnet 应用的 stdoutLog 日志,查看App Service 产生500错误的原因
|
4月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
|
4月前
|
存储 安全 网络安全
【Azure 环境】使用Azure中的App Service部署Web应用,以Windows为主机系统是否可以启动防病毒,防恶意软件服务呢(Microsoft Antimalware)?
【Azure 环境】使用Azure中的App Service部署Web应用,以Windows为主机系统是否可以启动防病毒,防恶意软件服务呢(Microsoft Antimalware)?
|
4月前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志