加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

webservice soap

发布时间:2020-12-16 23:35:24 所属栏目:安全 来源:网络整理
导读:import java.io.IOException;import java.io.StringReader;import java.io.StringWriter;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 java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
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.SOAPElement;
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.ws.soap.SOAPBinding;
import javax.xml.ws.soap.SOAPFaultException;
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.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:8000/ms?wsdl";
	@Test
	public void test01(){
		try {
			//1创建消息工厂
			MessageFactory factory = MessageFactory.newInstance();
			//2根据消息工厂创建SOAPMessage
			SOAPMessage message = factory.createMessage();
			//3创建SOAPPart
			SOAPPart part = message.getSOAPPart();
			//4创建SOAPEnvelope
			SOAPEnvelope envelope = part.getEnvelope();
			//5通过SOAPEnvelope获取body和header信息
			SOAPBody body = envelope.getBody();
			//6根据QNqme创建相应节点
			QName qname = new QName(ns,"add","ns");//<ns:add xlmns = "http://www.temple.java/webservice">
			
			//如果试用一下方法,</>会幻化为<
			//body.addBodyElement(qname).setValue("<a>1</a><b>2</b>");
			SOAPBodyElement element = body.addBodyElement(qname);
			element.addChildElement("a").setValue("22");
			element.addChildElement("b").setValue("10");
			//打印消息
			message.writeTo(System.out);
			
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	
	
	@Test
	public void test02(){
		try {
			//1创建服务
			URL url = new URL(wsdlURL);
			QName qname = new QName(ns,"MyServiceImplService");
			Service service = Service.create(qname);
			//给服务添加添加port
			
			service.addPort(new QName(ns,"MyServiceImplPort"),SOAPBinding.SOAP11HTTP_BINDING,"http://localhost:8000/ms");
			//2创建dispatch
			Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,SOAPMessage.class,Service.Mode.MESSAGE);
			
			SOAPMessage message = MessageFactory.newInstance().createMessage();
			SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
			SOAPBody body = envelope.getBody();
			
			//4创建QName来制定消息中传递的数据
			QName ename = new QName(ns,"nn");
			SOAPElement ele = body.addBodyElement(ename);
			ele.addChildElement("a").setValue("12");
			ele.addChildElement("b").setValue("10");
			//message.writeTo(System.out);
			System.out.print("invoking...");
			//传递消息
			SOAPMessage response = dispatch.invoke(message);
			response.writeTo(System.out);
			
			//将响应消息转化为dom对象
			Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
			String str = doc.getElementsByTagName("addResult").item(0).getTextContent();
			System.out.print(str);
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	@Test
	public void test03() {
		try {
			//1、创建服务(Service)
			URL url = new URL(wsdlURL);
			QName sname = new QName(ns,"MyServiceImplService");
			Service service = Service.create(url,sname);
			
			//2、创建Dispatch(通过源数据的方式传递)
			Dispatch<Source> dispatch = service.createDispatch(new QName(ns,Source.class,Service.Mode.PAYLOAD);
			//3、根据用户对象创建相应的xml
			User user = new User(3,"zs","张三","22222");
			JAXBContext ctx = JAXBContext.newInstance(User.class);
			Marshaller mar = ctx.createMarshaller();
			mar.setProperty(Marshaller.JAXB_FRAGMENT,true);
			StringWriter writer= new StringWriter();
			mar.marshal(user,writer);
			
			//4、封装相应的part addUser
			String payload = "<nn:addUser xmlns:nn=""+ns+"">"+writer.toString()+"</nn:addUser>";
			System.out.println(payload);
			StreamSource rs = new StreamSource(new StringReader(payload));
			
			//5、通过dispatch传递payload
			Source response = (Source)dispatch.invoke(rs);
			
			//6、将Source转化为DOM进行操作,使用Transform对象转换
			Transformer tran = TransformerFactory.newInstance().newTransformer();
			DOMResult result = new DOMResult();
			tran.transform(response,result);
			
			//7、处理相应信息(通过xpath处理)
			XPath xpath = XPathFactory.newInstance().newXPath();
			NodeList nl = (NodeList)xpath.evaluate("//user",result.getNode(),XPathConstants.NODESET);
			User ru = (User)ctx.createUnmarshaller().unmarshal(nl.item(0));
			System.out.println(ru.getNickname());
		} 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();
		}
	}
	
	@Test
	public void test04(){
		try {
			//1创建服务
			URL url = new URL(wsdlURL);
			QName qname = new QName(ns,Service.Mode.MESSAGE);
			
			//3SOAPBody
			SOAPMessage message = MessageFactory.newInstance().createMessage();
			SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
			SOAPBody body = envelope.getBody();
			//3.2处理SOAPHeader
			SOAPHeader header = envelope.getHeader();
			if(header == null) header = envelope.addHeader();
			QName hname = new QName(ns,"authInfo","nn");
			header.addHeaderElement(hname).setValue("abcd");
			
			
			//4创建QName来制定消息中传递的数据
			QName ename = new QName(ns,"list","nn");
			SOAPElement ele = body.addBodyElement(ename);
			message.writeTo(System.out);
			System.out.print("invoking...");
			//传递消息
			SOAPMessage response = dispatch.invoke(message);
			response.writeTo(System.out);
			
			//将响应消息转化为dom对象
			Document doc = response.getSOAPBody().extractContentAsDocument();
			NodeList nl  =doc.getElementsByTagName("user");
			JAXBContext ctx = JAXBContext.newInstance(User.class);
			for(int i = 0; i< nl.getLength(); i ++){
				Node n = nl.item(i);
				User user = (User)ctx.createUnmarshaller().unmarshal(n);
				System.out.println(user.getNickname());
			}
		} catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
		} catch (JAXBException e) {
			e.printStackTrace();
		}
		
	}
	
	@Test
	public void test05() throws JAXBException{
		try {
			//1创建服务
			URL url = new URL(wsdlURL);
			QName qname = new QName(ns,Service.Mode.MESSAGE);
			
			//3SOAPBody
			SOAPMessage message = MessageFactory.newInstance().createMessage();
			SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
			SOAPBody body = envelope.getBody();
			
			//4创建QName来制定消息中传递的数据
			QName ename = new QName(ns,"login","nn");
			SOAPElement ele = body.addBodyElement(ename);
			ele.addChildElement("username").setValue("ss");
			ele.addChildElement("password").setValue("13");
			message.writeTo(System.out);
			System.out.print("invoking...");
			//传递消息
			SOAPMessage response = dispatch.invoke(message);
			response.writeTo(System.out);
		}catch(SOAPFaultException e){
			System.out.print(e.getMessage());
		} 
		catch (SOAPException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读