创建服务器端
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