SOAP訊息的傳遞和處理(PAYLOAD方式)
阿新 • • 發佈:2019-02-08
/** * 訊息的傳遞和處理(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(); } }