前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用CXF调用Webservice接口添加SoapHeader

使用CXF调用Webservice接口添加SoapHeader

原创
作者头像
JQ实验室
发布2023-01-12 15:11:49
1.9K0
发布2023-01-12 15:11:49
举报
文章被收录于专栏:实用技术实用技术
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);
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WebService是啥:
  • CXF是啥:
  • soupheader是啥:
  • 需要添加的soapheader
  • 编码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档