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,"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();
}
}
@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,"MyServiceImplPort"),
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,"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,"MyServiceImplPort"), SOAPMessage.class, 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,"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,"MyServiceImplPort"), SOAPMessage.class, 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();
}
}
}
webservice soap
最新推荐文章于 2023-12-19 17:31:06 发布