如何在Axis2中添加SOAP头(转)

文章介绍了如何在ApacheAxis2客户端代码中,特别是在MathStub类中,通过修改ServiceClient并添加自定义SOAPHeader,以适应服务端要求。作者提供了详细的方法实现步骤,展示了如何使用OMElement和SOAPHeaderBlock来构建和添加Header到SOAPEnvelope中。
摘要由CSDN通过智能技术生成

还是使用之前的工程

WSDL文件生成方式参照:

http://blog.csdn.net/a19881029/article/details/40194787

客户端代码生成方式参照:

http://blog.csdn.net/a19881029/article/details/40198649

最后生成的客户端代码格式如下:

MathStub.java类中的add方法有下面这一段代码:

......
//其它构造函数最终都是调用这个函数创建MathStub对象

public MathStub(org.apache.axis2.context.ConfigurationContext configurationContext,
        java.lang.String targetEndpoint, boolean useSeparateListener)
        throws org.apache.axis2.AxisFault {
    populateAxisService();
    populateFaults();
    _serviceClient = new org.apache.axis2.client.ServiceClient(
            configurationContext, _service);
    _serviceClient.getOptions().setTo(
            new org.apache.axis2.addressing.EndpointReference(targetEndpoint));
    _serviceClient.getOptions().setUseSeparateListener(useSeparateListener);
    _serviceClient.getOptions().setSoapVersionURI(
            org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
}
......
public com.sean.AddResponse add(com.sean.Add add0)
        throws java.rmi.RemoteException{
......
    // adding SOAP soap_headers
    _serviceClient.addHeadersToEnvelope(env);
......
}

看了下ServiceClient的源码:

......
private ArrayList<OMElement> headers;
......
public void addHeader(OMElement header) {
    if (headers == null) {
        headers = new ArrayList<OMElement>();
    }
    headers.add(header);
}
 
/**
 * Add SOAP Header to be sent with outgoing messages.
 *
 * @param header header to be sent (non-<code>null</code>)
 */
public void addHeader(SOAPHeaderBlock header) {
    if (headers == null) {
        headers = new ArrayList<OMElement>();
    }
    headers.add(header);
}
 
/** Remove all headers for outgoing message. */
public void removeHeaders() {
    if (headers != null) {
        headers.clear();
    }
}
    
public void addStringHeader(QName headerName, String headerText) throws AxisFault {
    if (headerName.getNamespaceURI() == null || 
            "".equals(headerName.getNamespaceURI())) {
        throw new AxisFault("Failed to add string header," 
                + " you have to have namespaceURI for the QName");
    }
    OMElement omElement = OMAbstractFactory.getOMFactory()
            .createOMElement(headerName, null);
    omElement.setText(headerText);
    addHeader(omElement);
}
 
/**
 * Add all configured headers to a SOAP envelope.
 *
 * @param envelope the SOAPEnvelope in which to write the headers
 */
public void addHeadersToEnvelope(SOAPEnvelope envelope) {
    if (headers != null) {
        SOAPHeader soapHeader = envelope.getHeader();
        for (Object header : headers) {
            soapHeader.addChild((OMElement)header);
        }
    }
}

修改方式已经很明确了,在MathStub类中创建私有方法,通过AXIOM(使用版本为:1.2.14)生成所需头对象,然后将该头对象添加至ServiceClient对象即可

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.client.ServiceClient;

public MathStub(org.apache.axis2.context.ConfigurationContext configurationContext,
        java.lang.String targetEndpoint, boolean useSeparateListener)
        throws org.apache.axis2.AxisFault {
    populateAxisService();
    populateFaults();
    _serviceClient = new org.apache.axis2.client.ServiceClient(
            configurationContext, _service);
    //添加SOAP头
    this.addHeaders(_serviceClient);
    _serviceClient.getOptions().setTo(
            new org.apache.axis2.addressing.EndpointReference(targetEndpoint));
    _serviceClient.getOptions().setUseSeparateListener(useSeparateListener);
    _serviceClient.getOptions().setSoapVersionURI(
            org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
}
......
private void addHeaders(org.apache.axis2.client.ServiceClient _serviceClient){
    OMFactory omFactory = OMAbstractFactory.getOMFactory();
    OMNamespace omNS=omFactory.createOMNamespace("http://sean.com","sean");
    
    OMElement head = omFactory.createOMElement("Security", omNS);
    OMElement token = omFactory.createOMElement("Token", omNS);
    head.addChild(token);
        
    OMElement userName = omFactory.createOMElement("Username", omNS);
    userName.addChild(omFactory.createOMText(userName, "root"));
    token.addChild(userName);
        
    OMElement password = omFactory.createOMElement("Password", omNS);
    password.addAttribute(omFactory.createOMAttribute("Type", null, "PasswordText"));
    password.addChild(omFactory.createOMText(password, "123"));
    token.addChild(password);
        
    _serviceClient.addHeader(head);
}


添加SOAP头之前的请求格式如下:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <ns1:add xmlns:ns1="http://sean.com">
            <ns1:x>1</ns1:x>
            <ns1:y>1</ns1:y>
        </ns1:add>
    </soapenv:Body>
</soapenv:Envelope>


添加SOAP头之后的请求格式如下:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Header>
        <sean:Security xmlns:sean="http://sean.com">
            <sean:Token>
                <sean:Username>root</sean:Username>
                <sean:Password Type="PasswordText">123</sean:Password>
            </sean:Token>
        </sean:Security>
    </soapenv:Header>
    <soapenv:Body>
        <ns1:add xmlns:ns1="http://sean.com">
            <ns1:x>1</ns1:x>
            <ns1:y>1</ns1:y>
        </ns1:add>
    </soapenv:Body>
</soapenv:Envelope>

                       
原文链接:https://blog.csdn.net/a19881029/article/details/41643573/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值