如何在Axis2中添加SOAP头

还是使用之前的工程

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>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以通过以下步骤向SOAP添加用户名和密码: 1. 创建一个包含用户名和密码的SOAPHeader对象。 2. 将SOAPHeader对象添加SOAPEnvelope。 3. 将SOAPEnvelope对象设置为SOAPMessage对象的内容。 4. 使用SOAPConnection发送SOAPMessage对象。 以下代码片段演示了如何向SOAP添加用户名和密码: ```java // 创建SOAP消息 SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); // 创建SOAP SOAPHeader soapHeader = soapMessage.getSOAPHeader(); // 创建身份验证信息 String username = "username"; String password = "password"; String authString = username + ":" + password; String authStringEnc = new String(Base64.encodeBase64(authString.getBytes())); // 添加身份验证信息到SOAP SOAPHeaderElement authHeader = soapHeader.addHeaderElement(new QName("http://example.com", "Authentication", "auth")); authHeader.addChildElement("Username").setValue(username); authHeader.addChildElement("Password").setValue(password); authHeader.addChildElement("AuthType").setValue("Basic"); authHeader.addChildElement("AuthData").setValue(authStringEnc); // 将SOAPEnvelope对象设置为SOAPMessage对象的内容 soapMessage.saveChanges(); // 发送SOAP消息 SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection soapConnection = soapConnectionFactory.createConnection(); SOAPMessage soapResponse = soapConnection.call(soapMessage, "http://example.com/soap"); ``` 请注意,上面的代码片段使用了Apache Commons Codec库的Base64类来编码用户名和密码。您需要将此库添加到您的项目,或者使用其他编码库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值