https://blog.csdn.net/Peng_Hong_fu/article/details/80113196java
記錄測試代碼
SoapUI
調用路徑node
http://localhost:8082/*/webservices/**Service?wsdlweb
import org.apache.commons.lang.StringUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.xpath.DefaultXPath; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; import java.util.Collections; import java.util.List; /** * 模擬soapUI調用WebService,解析返回報文 * Created by PengHongfu 2018-04-26 15:36 */ public class TestSoap { //測試環境地址 public static String INVOICE_WS_URL = "http://localhost:8082/*/webservices/**Service"; public static void main(String[] args) throws Exception { String sid = "SID值"; String content = "報文內容,jOSN格式"; String tranSeq = "UUID"; String tranReqDate = "2018-04-24"; StringBuffer stringBuffer = testWebService(sid, content, tranSeq, tranReqDate); // 打印HTTP響應數據 System.out.println(stringBuffer); //處理返回數據 String xmlResult = stringBuffer.toString().replace("<", "<"); String rtnCode = getXmlMessageByName(xmlResult, "rtnCode");//報文返回狀態碼,0表示正常,3表示錯誤 String message = getXmlMessageByName(xmlResult, "message");//返回信息,主要是狀態碼不正常時拋出 String body = getXmlMessageByName(xmlResult, "body");//返回正文數據,須要base64解密 if ("0".equals(rtnCode)) { //查詢成功 if (StringUtils.isNotBlank(body)) { //解密base64加密數據 Base64.Decoder decoder = Base64.getDecoder(); byte[] encodedText = body.getBytes(); String decrypt = new String(decoder.decode(encodedText), "UTF-8"); System.out.println(decrypt); } } else { //查詢失敗 } } // 調用WS private static StringBuffer testWebService(String sid, String content, String tranSeq, String tranReqDate) throws Exception { //拼接請求報文 String sendMsg = appendXmlContext(sid, content, tranSeq, tranReqDate); // 開啓HTTP鏈接ַ InputStreamReader isr = null; BufferedReader inReader = null; StringBuffer result = null; OutputStream outObject = null; try { URL url = new URL(INVOICE_WS_URL); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); // 設置HTTP請求相關信息 httpConn.setRequestProperty("Content-Length", String.valueOf(sendMsg.getBytes().length)); httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); httpConn.setRequestMethod("POST"); httpConn.setDoOutput(true); httpConn.setDoInput(true); // 進行HTTP請求 outObject = httpConn.getOutputStream(); outObject.write(sendMsg.getBytes()); if (200 != (httpConn.getResponseCode())) { throw new Exception("HTTP Request is not success, Response code is " + httpConn.getResponseCode()); } // 獲取HTTP響應數據 isr = new InputStreamReader( httpConn.getInputStream(), "utf-8"); inReader = new BufferedReader(isr); result = new StringBuffer(); String inputLine; while ((inputLine = inReader.readLine()) != null) { result.append(inputLine); } return result; } catch (IOException e) { throw e; } finally { // 關閉輸入流 if (inReader != null) { inReader.close(); } if (isr != null) { isr.close(); } // 關閉輸出流 if (outObject != null) { outObject.close(); } } } //拼接請求報文 private static String appendXmlContext(String sid, String content, String tranSeq, String tranReqDate) { // 構建請求報文 StringBuffer stringBuffer = new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:com=\"http://com.foresee.top.service/\">\n" + " <soapenv:Body>\n" + " <ns1:doService xmlns:ns1=\"http://cn.gov.chinatax.gt3nf.nfzcpt.service/\">\n" + " <reqXml><![CDATA[<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<tiripPackage xmlns:xsi=\"http://www.w3.org/2001/XMLSchema\" version=\"1.0\" xsi:type=\"tiripPackage\">\n" + " <sessionId/>\n" + " <service>\n" + " <sid>" + sid + "</sid>\n" + " <version>1.0</version>\n" + " <tranSeq>+" + tranSeq + "</tranSeq>\n" + " <tranReqDate>" + tranReqDate + "</tranReqDate>\n" + " </service>\n" + " <bizContent>\n" + " <content>" + content + "</content>\n" + " <paramList>\n" + " <param>\n" + " <name>docType</name>\n" + " <value>json</value>\n" + " </param>\n" + " <param>\n" + " <name>className</name>\n" + " <value>GGG</value>\n" + " </param>\n" + " </paramList>\n" + " </bizContent>\n" + "</tiripPackage>\n" + "]]></reqXml>\n" + " </ns1:doService>\n" + " </soapenv:Body>\n" + "</soapenv:Envelope>"); return stringBuffer.toString(); } //解析報文,根據末節點名稱獲取值 private static String getXmlMessageByName(String xmlResult, String nodeName) throws DocumentException { Document doc = DocumentHelper.parseText(xmlResult); DefaultXPath xPath = new DefaultXPath("//" + nodeName); xPath.setNamespaceURIs(Collections.singletonMap("ns1", "http://cn.gov.chinatax.gt3nf.nfzcpt.service/")); List list = xPath.selectNodes(doc); if (!list.isEmpty() && list.size() > 0) { Element node = (Element) list.get(0); return node.getText(); } return ""; } }
針對下面的報文格式,取節點值:apache
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns1:doServiceResponse xmlns:ns1="http://cn.gov.chinatax.gt3nf.nfzcpt.service/"> <return><![CDATA[<taxML><service><sid>SID值</sid><channelType>10</channelType><version>1.0</version><tranSeq>UUID</tranSeq><tranReqDate>20171204</tranReqDate></service><bizContent><bizResult><head><rtnCode>0</rtnCode><rtnMsg><code>000</code><message>處理成功</message><reason></reason></rtnMsg></head><body>PFJFU1BPTlNFX0NPT1k+(BASE64加密後的數據)</body></bizResult></bizContent><returnState><returnCode>00000</returnCode><returnMessage>Success!</returnMessage></returnState></taxML>]]></return> </ns1:doServiceResponse> </soap:Body> </soap:Envelope>