SOAP消息的创建,传递,处理的学习笔记

User.class

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) {
		this.id = id;
		this.username = username;
		this.nickname = nickname;
		this.password = password;
	}
	public User() {
	}
}


IMyService.class

import java.util.List;

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

@WebService
public interface IMyService {
	
	@WebResult(name="addResult")
	public int add(@WebParam(name="a")int a, @WebParam(name="b")int b);

	@WebResult(name="user")
	public User addUser(@WebParam(name="user")User user);
	
	@WebResult(name="user")
	public User login(@WebParam(name="username")String username, @WebParam(name="password")String password);
	
	@WebResult(name="user")
	public List<User> list(@WebParam(header=true,name="authInfo")String authInfo);
}



 
MyServiceImpl.class 

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

import javax.jws.WebService;


@WebService(endpointInterface="org.soap.service.IMyService")
public class MyServiceImpl implements IMyService {

	private static List<User> users = new ArrayList<User>();
	
	
	public MyServiceImpl() {
		users.add(new User(1,"admin","管理员","111111"));
	}

	@Override
	public int add(int a, int b) {
		System.out.println("a + b = "+(a+b));
		return a+b;
	}

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

	@Override
	public User login(String username, String password) {
        for(User user : users){
        	if(username.equals(user.getUsername()) && password.equals(user.getPassword())){
        		return user;
        	}
        }
		return null;
	}

	@Override
	public List<User> list(String authInfo) {
		System.out.println(authInfo);
		return users;
	}

}


 
 

MyService.class 启动服务

import javax.xml.ws.Endpoint;

public class MyService {

	public static void main(String[] args) {
		Endpoint.publish("http://localhost:8989/ms", new MyServiceImpl());
	}
}

soap消息的格式


TestSOAP.clas soap创建与测试

package com.lzb.test;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.junit.Test;
import org.soap.service.User;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class TestSOAP {

	private String ns = "http://service.soap.org/";
	private String wsdlUrl = "http://localhost:8989/ms?wsdl";

	// soap消息的分析和消息的创建
	@Test
	public void test01() {
		try {
			// 1.创建消息工厂
			MessageFactory messageFactory = MessageFactory.newInstance();
			// 2.根据消息工厂穿件SoapMessage
			SOAPMessage message = messageFactory.createMessage();
			// 3.创建SoapPart
			SOAPPart soapPart = message.getSOAPPart();
			// 4.获取SOAPEnvelope
			SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
			// 5.可以通过SOAPEnvelope有效获取相应的Body和Header等信息
			SOAPBody soapBody = soapEnvelope.getBody();
			// 6.根据Qname创建相应的节点(QName就是一个带有命名空间的节点)-》最后转化的结果是<ns:add
			// xmlns="http://java.lzb.bbb.cn/webservice" />
			QName qname = new QName(ns, "add", "ns");
			// soapBody.addBodyElement(qname).setValue("565656");
			// 如果用以下方进行设置,会将<>转换成<和>
			// soapBody.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
			SOAPBodyElement element = soapBody.addBodyElement(qname);
			element.addChildElement("a").setValue("33");
			element.addChildElement("b").setValue("77");
			// 打印消息、
			message.writeTo(System.out);

		} catch (SOAPException | IOException e) {
			e.printStackTrace();
		}
	}

	// soap消息传递和处理
	@Test
	public void test02() {
		try {
			// 1.创建服务(Service)
			URL url = new URL(wsdlUrl);
			QName qname = new QName(ns, "MyServiceImplService");
			Service service = Service.create(url, qname);

			// 2.创建Dispatch
			Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(
					ns, "MyServiceImplPort"), SOAPMessage.class,
					Service.Mode.MESSAGE);

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

			// 4.创建QName来指定消息中传递数据
			QName ename = new QName(ns, "add", "nn"); // <nn:add xmlns="xx">
			SOAPBodyElement element = body.addBodyElement(ename);
			element.addChildElement("a").setValue("23");
			element.addChildElement("b").setValue("27");
			message.writeTo(System.out);
			System.out.println("\n invoking ...");
			// 5.通过Dispatch传递消息
			SOAPMessage response = dispatch.invoke(message);
			response.writeTo(System.out);

			// 将相应消息转为Dom对象
			Document document = response.getSOAPPart().getEnvelope().getBody()
					.extractContentAsDocument();
			System.out.println(document.getElementsByTagName("addResult")
					.item(0).getTextContent());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 消息传递和处理(基于Payload的方式)
	@Test
	public void test03() {
		try {
			// 1.创建服务(Service)
			URL url = new URL(wsdlUrl);
			QName qname = new QName(ns, "MyServiceImplService");
			Service service = Service.create(url, qname);

			// 2.创建Dispatch(通过元数据的方式传递)
			Dispatch<Source> dispatch = service.createDispatch(new QName(ns,
					"MyServiceImplPort"), Source.class, Service.Mode.PAYLOAD);
			// 3.根据用户对象创建相应的XML
			User user = new User(3, "abner", "请叫我斌哥", "222222");
			JAXBContext ctx = JAXBContext.newInstance(User.class);
			Marshaller mar = ctx.createMarshaller();
			mar.setProperty(Marshaller.JAXB_FRAGMENT, true);
			StringWriter stringWriter = new StringWriter();
			mar.marshal(user, stringWriter);

			// 4.封装相应的part addUser
			String payload = "<nn:addUser xmlns:nn=\"" + ns + "\">"
					+ stringWriter.toString() + "/</nn:addUser>";
			System.out.println(payload);
			StreamSource streamSource = new StreamSource(new StringReader(
					payload));

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

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

			// 7.处理相应信息
			XPath xPath = XPathFactory.newInstance().newXPath();
			NodeList nl = (NodeList) xPath.evaluate("//user",
					domResult.getNode(), XPathConstants.NODESET);
			User user1 = (User) ctx.createUnmarshaller().unmarshal(nl.item(0));
			System.out.println(user1.getNickname());

		} catch (MalformedURLException 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();
		}
	}

	// SOAP显示的创建和处理SOAPHeader的信息
	@Test
	public void test04() {
		try {
			// 1.创建服务(Service)
			URL url = new URL(wsdlUrl);
			QName qname = new QName(ns, "MyServiceImplService");
			Service service = Service.create(url, qname);

			// 2.创建Dispatch
			Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(
					ns, "MyServiceImplPort"), SOAPMessage.class,
					Service.Mode.MESSAGE);

			// 3.创建SOAPMessage
			SOAPMessage message = MessageFactory.newInstance().createMessage();
			SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
			SOAPBody body = envelope.getBody();
			
			//3.2 处理header信息
			SOAPHeader header = envelope.getHeader();
			if(header == null){
				header = envelope.addHeader();
			}
			QName hqname = new QName(ns, "authInfo", "nn");
			header.addChildElement(hqname).setValue("aaaaaa");;

			// 4.创建QName来指定消息中传递数据
			QName ename = new QName(ns, "list", "nn"); // <nn:add xmlns="xx">
			body.addBodyElement(ename);
			message.writeTo(System.out);
			System.out.println("\n invoking ...");
			// 5.通过Dispatch传递消息
			SOAPMessage response = dispatch.invoke(message);
			response.writeTo(System.out);

			// 将相应消息转为Dom对象
			Document document = response.getSOAPBody().extractContentAsDocument();
			NodeList nl = document.getElementsByTagName("user");
			JAXBContext ctx = JAXBContext.newInstance(User.class);
			for(int i = 0; i < nl.getLength(); i++){
				Node n = nl.item(i);
				User u = (User)ctx.createUnmarshaller().unmarshal(n);
				System.out.println(u.getNickname());
			}
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值