webservice soap

来源:互联网 发布:南林教务网络管理 编辑:程序博客网 时间:2024/06/05 18:32
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";@Testpublic void test01(){try {//1创建消息工厂MessageFactory factory = MessageFactory.newInstance();//2根据消息工厂创建SOAPMessageSOAPMessage message = factory.createMessage();//3创建SOAPPartSOAPPart part = message.getSOAPPart();//4创建SOAPEnvelopeSOAPEnvelope 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();}}@Testpublic void test02(){try {//1创建服务URL url = new URL(wsdlURL);QName qname = new QName(ns,"MyServiceImplService");Service service = Service.create(qname);//给服务添加添加portservice.addPort(new QName(ns,"MyServiceImplPort"), SOAPBinding.SOAP11HTTP_BINDING, "http://localhost:8000/ms");//2创建dispatchDispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"), 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,"add","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();}}@Testpublic 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,"MyServiceImplPort"),Source.class, Service.Mode.PAYLOAD);//3、根据用户对象创建相应的xmlUser 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 addUserString payload = "<nn:addUser xmlns:nn=\""+ns+"\">"+writer.toString()+"</nn:addUser>";System.out.println(payload);StreamSource rs = new StreamSource(new StringReader(payload));//5、通过dispatch传递payloadSource 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();}}@Testpublic void test04(){try {//1创建服务URL url = new URL(wsdlURL);QName qname = new QName(ns,"MyServiceImplService");Service service = Service.create(qname);//给服务添加添加portservice.addPort(new QName(ns,"MyServiceImplPort"), SOAPBinding.SOAP11HTTP_BINDING, "http://localhost:8000/ms");//2创建dispatchDispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);//3SOAPBodySOAPMessage message = MessageFactory.newInstance().createMessage();SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();SOAPBody body = envelope.getBody();//3.2处理SOAPHeaderSOAPHeader 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();}}@Testpublic void test05() throws JAXBException{try {//1创建服务URL url = new URL(wsdlURL);QName qname = new QName(ns,"MyServiceImplService");Service service = Service.create(qname);//给服务添加添加portservice.addPort(new QName(ns,"MyServiceImplPort"), SOAPBinding.SOAP11HTTP_BINDING, "http://localhost:8000/ms");//2创建dispatchDispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns,"MyServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);//3SOAPBodySOAPMessage 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();}}}

0 0
原创粉丝点击