1. 程式人生 > >SOAP訊息的傳遞和處理(PAYLOAD方式)

SOAP訊息的傳遞和處理(PAYLOAD方式)

/**
 * 訊息的傳遞和處理(PAYLOAD)
 * 通過負載來傳遞
 */
@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", "張三", "111111");
		JAXBContext ctx = JAXBContext.newInstance(User.class);
		Marshaller mar = ctx.createMarshaller();
		//是否省略xml頭資訊(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>)
		mar.setProperty(Marshaller.JAXB_FRAGMENT, true);
		StringWriter writer = new StringWriter();
		mar.marshal(user, writer);
		System.out.println(writer);
		/*
		 * 上面操作為把使用者物件轉換為xml(marshal),列印結果為:
		 * <user>
		 * 	<id>3</id>
		 * 	<nickName>張三</nickName>
		 * 	<password>111111</password>
		 * 	<userName>zs</userName>
		 * </user>
		 */
		
		//4.封裝相應的part addUser
		String payLoad = "<nn:addUser xmlns:nn=\"" + ns + "\">" + writer.toString() + "</nn:addUser>";
		System.out.println(payLoad);
		/*
		 * 上面步驟3、4為封裝相應的part
		 * 列印結果為:
		 * <nn:addUser xmlns:nn="http://service.soap.org/">
		 * 	<user>
		 * 		<id>3</id>
		 * 		<nickName>張三</nickName>
		 * 		<password>111111</password>
		 * 		<userName>zs</userName>
		 * 	</user>
		 * </nn:addUser>
		 */
		
		//5.通過dispatch傳遞payLoad
		StreamSource ss = new StreamSource(new StringReader(payLoad));
		Source response = (Source)dispatch.invoke(ss);
		
		//6.將Source轉換為DOM進行操作,使用Transformer物件轉換
		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);
		System.out.println(nl.item(0).getNodeName());	//列印節點名稱
		/*
		 * 列印結果為:user
		 */
		
		//反編排
		User ru = (User)ctx.createUnmarshaller().unmarshal(nl.item(0));
		System.out.println(ru.getNickName());
		/*
		 * 上面步驟6、7為處理返回的訊息,將Source轉換為DOM,然後通過XPath處理xml,最後unmarshal為java資訊
		 * 列印結果為:張三
		 */
	} catch (MalformedURLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (JAXBException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (TransformerConfigurationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (TransformerFactoryConfigurationError e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (TransformerException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (XPathExpressionException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}