apache-cxf测试webservice添加header信息

本文介绍如何使用 Apache CXF 在 SOAP 消息中添加自定义 Header 信息。通过创建 SoapHeaderInterceptor 类并实现相应的处理方法,可以实现在发送 SOAP 请求时加入特定的 Header 数据。此外,还提供了配置示例及所需依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用apache-cxf自动生成webservice本地类,有时需要在soap中添加header信息,如下面
<soap:header>
    <username>youthflies</username>
    <password>youthflies</username>
</soap:header>
我们可以在生成webservice client的时候,手动添加上我们需要的header信息。 新建一个 SoapHeaderInterceptor.java,内容如下:
package com.yeetrack.webservice;

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;

/**
 * @author youthflies
 * 自定义的soap拦截器,用来添加header信息
 */
public class SoapHeaderInterceptor extends AbstractSoapInterceptor
{
    public SoapHeaderInterceptor()
    {
        super(Phase.WRITE);
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault
    {
        // TODO Auto-generated method stub   
        List headers=message.getHeaders(); 
        headers.add(getHeader("username", "youthflies"));
        headers.add(getHeader("password", "youthflies"));
    }

    //http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
    private Header getHeader(String key, String value) 
    { 
        QName qName=new QName("http://webservice.webxml.com.cn/", key); 

        Document document=DOMUtils.createDocument(); 
        Element element=document.createElementNS("http://webservice.webxml.com.cn/", key); 
        element.setTextContent(value); 

        SoapHeader header=new SoapHeader(qName, element); 
        return(header); 
    }

}
再给个有子节点的header例子:
public void handleMessage(SoapMessage arg0) throws Fault 
{
    QName qName=new QName("http://yourdomain.com/");    
    Document doc = DOMUtils.createDocument();  
    Element root = doc.createElement("AuthenticationToken");  

    Element username = doc.createElement("username");  
    username.setTextContent("yeetrack.com");  

    Element password = doc.createElement("password");  
    password.setTextContent("yeetrack.com");  

    Element args = doc.createElement("someargs");  
    args.setTextContent("其他参数");  

    root.appendChild(username);  
    root.appendChild(password);  
    root.appendChild(args);  
    SoapHeader header = new SoapHeader(qName, root);
        // 获取SOAP消息的全部头  
    List<Header> headers = arg0.getHeaders();  
    headers.add(header);    
}
然后,再我们的测试case中,添加拦截器:
    //实例化接口实现类
   MobileCodeWS mobileCodeWS = new MobileCodeWS();
   //实例化接口
   MobileCodeWSSoap mobileCodeWSSoap = mobileCodeWS.getMobileCodeWSSoap();

   Client client = ClientProxy.getClient(mobileCodeWSSoap);
   client.getOutInterceptors().add(new SoapHeaderInterceptor());

   //调用接口中的方法
   System.out.println(mobileCodeWSSoap.getMobileCodeInfo("13898767654", ""));
依赖的jar包:
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>2.7.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-bindings-soap</artifactId>
    <version>2.7.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
    <artifactId>wss4j</artifactId>
    <version>1.6.10</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-ws-security</artifactId>
    <version>2.7.5</version>
</dependency>
效果如wireshark抓包: wireshark抓取webservice maven cxf-codegen-plugin插件测试webservice

转载于:https://my.oschina.net/u/147181/blog/164947

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值