soap消息的创建和传递

创建服务器端

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 {
	@WebResult(name = "addResult")
	public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b);
}

 

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 {
	@Override
	public int add(int a, int b) {
		return a + b;
	}
}

 

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

(1)SOAP消息的创建

// 通过QName创建SOAP的body消息
@Test
public void test01() {
	try {
		// 创建消息工厂
		MessageFactory factory = MessageFactory.newInstance();
		// 根据消息工厂创建SOAPMessage
		SOAPMessage message = factory.createMessage();
		// 创建SOAPPart
		SOAPPart part = message.getSOAPPart();
		// 获取SOAPEnvelope
		SOAPEnvelope envelope = part.getEnvelope();
		// 通过 SOAPEnvelope获取相应的body和header信息
		SOAPBody body = envelope.getBody();
		// 根据QName创建相应的节点
		QName qname = new QName("http://www.webservice.com", "add", "ns");
		SOAPBodyElement element = body.addBodyElement(qname);
		element.addChildElement("a").setValue("12");
		element.addChildElement("b").setValue("13");
		// 打印消息信息
		message.writeTo(System.out);
	} catch (SOAPException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

 

运行结果:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns:add xmlns:ns="http://www.webservice.com"><a>12</a><b>13</b></ns:add></SOAP-ENV:Body></SOAP-ENV:Envelope>

(2)SOAP消息的创建(基于MESSAGE的方式)

// 基于MESSAGE的方式传递消息
@Test
public void test02() {
	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();
		SOAPBody body = message.getSOAPPart().getEnvelope().getBody();

		// 根据QName创建相应的节点
		QName ename = new QName("http://www.webservice.com", "add", "ns");
		SOAPBodyElement element = body.addBodyElement(ename);
		element.addChildElement("a").setValue("12");
		element.addChildElement("b").setValue("13");
		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.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
		System.out.println(doc.getElementsByTagName("addResult").item(0).getTextContent());
	} catch (SOAPException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

 

运行结果:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns:add xmlns:ns="http://www.webservice.com"><a>12</a><b>13</b></ns:add></SOAP-ENV:Body></SOAP-ENV:Envelope>

 invoking...

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header/><S:Body><ns2:addResponse xmlns:ns2="http://www.webservice.com"><addResult>25</addResult></ns2:addResponse></S:Body></S:Envelope>

25

(3)SOAP消息的创建(基于PAYLOAD的方式)

修改服务器端

第一步,添加实体类:User.java

package com.test.service;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class User {
	
	private int id;
	private String username;
	private String nickname;
	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public User(int id, String username, String nickname, String password) {
		super();
		this.id = id;
		this.username = username;
		this.nickname = nickname;
		this.password = password;
	}

	public User() {
		super();
	}

}

 

第二步,接口中添加addUser方法

IMyService.java

@WebResult(name = "user")
public User addUser(@WebParam(name = "user") User user);

 

MyServiceImpl.java

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

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

@Override
public User addUser(User user) {
	users.add(user);
	return user;
}

 

测试类

// 基于PAYLOAD的方式传递消息
@Test
public void test03() {
	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<Source> dispatch = service.createDispatch(new QName("http://www.webservice.com", "MyServiceImplPort"), Source.class, Service.Mode.PAYLOAD);

		// 根据用户对象创建响应的xml
		User user = new User(1, "张三", "zs", "123");
		JAXBContext ctx = JAXBContext.newInstance(User.class);
		Marshaller marshaller = ctx.createMarshaller();
		// 设置去掉xml的头信息
		marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
		StringWriter writer = new StringWriter();
		marshaller.marshal(user, writer);

		// 封装相应的part(addUser)
		String payload = "<ns:addUser xmlns:ns='http://www.webservice.com'>" + writer.toString() + "</ns:addUser>";
		StreamSource ss = new StreamSource(new StringReader(payload));

		// 通过dispatch传递payload
		Source response = dispatch.invoke(ss);

		// 使用Transformer对象,将Source转化为DOM进行操作
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		DOMResult result = new DOMResult();
		transformer.transform(response, result);

		// 通过xpath模型处理响应信息
		XPath xpath = XPathFactory.newInstance().newXPath();
		NodeList list = (NodeList) xpath.evaluate("//user", result.getNode(), XPathConstants.NODESET);
		User user2 = (User) ctx.createUnmarshaller().unmarshal(list.item(0));
		System.out.println(user2.getUsername());
	} catch (IOException e) {
		e.printStackTrace();
	} catch (JAXBException e) {
		e.printStackTrace();
	} catch (TransformerConfigurationException e) {
		e.printStackTrace();
	} catch (TransformerFactoryConfigurationError e) {
		e.printStackTrace();
	} catch (TransformerException e) {
		e.printStackTrace();
	} catch (XPathExpressionException e) {
		e.printStackTrace();
	}
}

 

运行结果:

张三

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值