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","张三","11111"); 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(); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。