`

soap中header头部消息传递

阅读更多

创建服务器端

1.创建一个接口

IMyService.java

package com.test.service;

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService(targetNamespace = "http://www.webservice.com")
public interface IMyService {
	// 传递header信息
	@WebResult(name = "user")
	public List<User> list(@WebParam(header = true, name = "authInformation") String authInformation);
}

 

2.创建实现接口的类

MyServiceImpl.java

package com.test.service;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebService;

@WebService(endpointInterface = "com.test.service.IMyService", targetNamespace = "http://www.webservice.com")
public class MyServiceImpl implements IMyService {

	private static List<User> users = new ArrayList<User>();

	public MyServiceImpl() {
		users.add(new User(1, "admin", "管理员", "111111"));
	}

	@Override
	public List<User> list(String authInformation) {
		// 打印客户端传递过来的头部信息
		System.out.println(authInformation);
		return users;
	}
}

 

3.开启服务

MyServer.java

package com.test.service;

import javax.xml.ws.Endpoint;

public class MyServer {
	public static void main(String[] args) {
		String address = "http://localhost:9999/server";
		// 发布服务的实现类
		Endpoint.publish(address, new MyServiceImpl());
	}
}

 

4.测试类TestSoap.java

// header头部消息传递
@Test
public void test04() {
	try {
		// 创建服务
		URL url = new URL("http://localhost:9999/server");
		QName qname = new QName("http://www.webservice.com", "MyServiceImplService");
		Service service = Service.create(url, qname);

		// 创建Dispatch
		Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName("http://www.webservice.com", "MyServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);

		// 创建SOAP的body消息
		SOAPMessage message = MessageFactory.newInstance().createMessage();
		SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
		SOAPBody body = envelope.getBody();

		// 创建SOAP的header消息
		SOAPHeader header = envelope.getHeader();
		if (header == null) {
			header = envelope.addHeader();
		}
		QName hname = new QName("http://www.webservice.com", "authInformation", "ns");
		header.addHeaderElement(hname).setValue("12345");

		// 根据QName创建相应的节点
		QName ename = new QName("http://www.webservice.com", "list", "ns");
		body.addBodyElement(ename);
		message.writeTo(System.out);
		System.out.println("\n invoking...");

		// 通过dispatch传递消息,返回响应消息
		SOAPMessage response = dispatch.invoke(message);
		response.writeTo(System.out);
		System.out.println();

		// 将响应的消息转换为dom对象
		Document doc = response.getSOAPBody().extractContentAsDocument();
		NodeList userList = doc.getElementsByTagName("user");
		Unmarshaller unmarshaller = JAXBContext.newInstance(User.class).createUnmarshaller();
		for (int i = 0; i < userList.getLength(); i++) {
			User user = (User) unmarshaller.unmarshal(userList.item(i));
			System.out.println(user.getNickname());
		}
	} catch (SOAPException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} catch (JAXBException e) {
		e.printStackTrace();
	}
}

 

运行结果:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><ns:authInformation xmlns:ns="http://www.webservice.com">12345</ns:authInformation></SOAP-ENV:Header><SOAP-ENV:Body><ns:list xmlns:ns="http://www.webservice.com"/></SOAP-ENV:Body></SOAP-ENV:Envelope>

 invoking...

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:listResponse xmlns:ns2="http://www.webservice.com"><user><id>1</id><nickname>管理员</nickname><password>111111</password><username>admin</username></user></ns2:listResponse></S:Body></S:Envelope>

管理员

 

在服务器端也会把设置的头部信息打印出:12345

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics