工作第一次遇到對接soap接口,覺得有必要記錄一下,畢竟踩了不少坑,網(wǎng)上帖子很多但大都不全,也不可能完全滿足自己的需求,于是就有了下面的代碼:
除了只是借鑒,
注意事項:1.http://ip:port/xxx/xxx/soap?wsdl有些soap接口,對面是不需要穿?wsdl對接時要問出清
2. httpPost.setHeader("SOAPAction", SOAPAction); SOAPAction也要問下,或者查看接口文件,有些只要傳空字符串
3.拼接報文時要注意格式,/n一類的特殊符號不能有文章來源:http://www.zghlxwxcb.cn/news/detail-755065.html
4.xml解析式注意編號,編號可能存在編碼來回切換returnDatabase = convertToUTF8(returnDatabase);文章來源地址http://www.zghlxwxcb.cn/news/detail-755065.html
package com.ankang.hospital.utils; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.hc.client5.http.classic.methods.HttpPost; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.core5.http.io.entity.EntityUtils; import org.apache.hc.core5.http.io.entity.StringEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j public class HttpClientUtil { private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class); /** * HttpClient 調(diào)用 WebService * * @param wsUrl webService地址,格式:http://ip:port/xxx/xxx/soap?wsdl * @param StrDate 格式的入?yún)trDate=2023/08/02 * @return */ public static String callServiceHC(String wsUrl, String StrDate) { String xml = createSoapContent(StrDate); String returnDatabase = doPostSoap(wsUrl, xml, "");//urn:hl7-org:v3/ZDYFWTYRK // 強(qiáng)制將返回結(jié)果轉(zhuǎn)換為 UTF-8 編碼 returnDatabase = convertToUTF8(returnDatabase); return returnDatabase; } /** * 強(qiáng)制轉(zhuǎn)換整utp-8 * @param input * @return */ public static String convertToUTF8(String input) { try { byte[] utf8Bytes = input.getBytes(StandardCharsets.UTF_8); return new String(utf8Bytes, StandardCharsets.UTF_8); } catch (Exception e) { e.printStackTrace(); } return input; // 返回原始字符串,如果轉(zhuǎn)換失敗 } /** * 根據(jù)拼接 xml 字符串 * * @param StrDate * @return */ public static String createSoapContent(String StrDate) { log.info("開始拼接請求報文"); //開始拼接請求報文 StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:hl7-org:v3\">\n"); stringBuilder.append("<soapenv:Header/>"); stringBuilder.append("<soapenv:Body>"); stringBuilder.append("<urn:ZDYFWTYRK>"); stringBuilder.append("<urn:req>"); //傳參action stringBuilder.append("<urn:action>"); stringBuilder.append("Z1901"); stringBuilder.append("</urn:action>"); //傳參rdn stringBuilder.append("<urn:rdn>"); stringBuilder.append("SSXWGYGXT"); stringBuilder.append("</urn:rdn>"); //傳參message stringBuilder.append("<urn:message><![CDATA["); stringBuilder.append("<Request>"); stringBuilder.append("<operDate>"); stringBuilder.append(StrDate); stringBuilder.append("</operDate>"); stringBuilder.append("<hoscode>"); stringBuilder.append("A001"); stringBuilder.append("</hoscode>"); stringBuilder.append("</Request>"); stringBuilder.append("]]></urn:message>"); stringBuilder.append("</urn:req>"); stringBuilder.append("</urn:ZDYFWTYRK>"); stringBuilder.append("</soapenv:Body>"); stringBuilder.append("</soapenv:Envelope>"); logger.debug("拼接后的參數(shù)\n" + stringBuilder.toString()); return stringBuilder.toString(); } /** * HTTPClient 調(diào)用 WebService * * @param url * @param soap * @param SOAPAction * @return */ public static String doPostSoap(String url, String soap, String SOAPAction) { //請求體 String retStr = ""; // 創(chuàng)建HttpClientBuilder HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); // HttpClient CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); HttpPost httpPost = new HttpPost(url); try { httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8"); httpPost.setHeader("SOAPAction", SOAPAction); StringEntity data = new StringEntity(soap, Charset.forName("UTF-8")); httpPost.setEntity(data); CloseableHttpResponse response = closeableHttpClient.execute(httpPost); HttpEntity httpEntity = response.getEntity(); if (httpEntity != null) { // 打印響應(yīng)內(nèi)容 retStr = EntityUtils.toString(httpEntity, "UTF-8"); } // 釋放資源 closeableHttpClient.close(); } catch (Exception e) { e.printStackTrace(); } return retStr; } public static String analyzeResult(String xmlContent) { try { // 從 xmlContent 字符串解析 XML DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // 啟用命名空間感知 DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xmlContent))); // 獲取根元素 (SOAP-ENV:Envelope) Element root = doc.getDocumentElement(); // 獲取 SOAP-ENV:Body 元素 Element body = null; NodeList bodyList = root.getElementsByTagName("SOAP-ENV:Body"); if (bodyList.getLength() > 0) { body = (Element) bodyList.item(0); } // 獲取帶有 'urn:hl7-org:v3' 命名空間的 ZDYFWTYRKResponse 元素 Element zdyfwtyrkResponse = (Element) body.getElementsByTagNameNS("urn:hl7-org:v3", "ZDYFWTYRKResponse").item(0); Element zdyfwtyrkResult = (Element) zdyfwtyrkResponse.getElementsByTagNameNS("urn:hl7-org:v3", "ZDYFWTYRKResult").item(0); // 獲取 ZDYFWTYRKResult 元素中的 CDATA 內(nèi)容(實際的結(jié)果數(shù)據(jù)) String cdataContent = zdyfwtyrkResult.getTextContent(); // 處理CDATA中的XML內(nèi)容 Document cdataDoc = builder.parse(new InputSource(new StringReader(cdataContent))); // 將Document轉(zhuǎn)換為不帶BOM的字符串 String cdataXmlString = convertDocumentToStringWithoutBOM(cdataDoc); logger.debug("cdataXmlString結(jié)果: " + cdataXmlString); return cdataXmlString; } catch (ParserConfigurationException e) { // 記錄異常信息到日志 log.error("XML解析器配置錯誤: " + e.getMessage(), e); } catch (IOException e) { // 記錄 IOException 異常信息到日志 log.error("發(fā)生 IO 異常: " + e.getMessage(), e); } catch (SAXException e) { // 記錄 SAXException 異常信息到日志 log.error("SAX 解析異常: " + e.getMessage(), e); } catch (TransformerException e) { log.error("XML的轉(zhuǎn)換、解析和轉(zhuǎn)換錯誤: " + e.getMessage(), e); } return null; } /** * 將 DOM Document 轉(zhuǎn)換為 UTF-8 無 BOM 格式的字符串。 * * @param doc 要轉(zhuǎn)換的 DOM Document。 * @return 不帶 BOM 的 UTF-8 字符串表示的文檔。 */ private static String convertDocumentToStringWithoutBOM(Document doc) throws TransformerException, UnsupportedEncodingException { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); // 設(shè)置編碼為 UTF-8 且不帶 BOM transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); // 省略 XML 聲明 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 格式化輸出 // 創(chuàng)建一個 ByteArrayOutputStream 來保存 XML 內(nèi)容 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); StreamResult result = new StreamResult(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)); // 將 Document 轉(zhuǎn)換為不帶 BOM 的字符串 transformer.transform(new DOMSource(doc), result); // 將 ByteArrayOutputStream 轉(zhuǎn)換為字符串 return outputStream.toString("UTF-8"); } public static List<Map<String, String>> resultMap1(String soapResponse) { // 從soapResponse中提取JSON部分 int startIndex = soapResponse.indexOf("<list>"); int endIndex = soapResponse.indexOf("</list>"); String jsonPart = soapResponse.substring(startIndex + "<list>".length(), endIndex); // 將JSON轉(zhuǎn)換為Map ObjectMapper objectMapper = new ObjectMapper(); try { Map<String, Object> resultMap = objectMapper.readValue(soapResponse, new TypeReference<Map<String, Object>>() { }); ; List<Map<String, Object>> resultJsonList = (List<Map<String, Object>>) resultMap.get("resultJson"); // 轉(zhuǎn)換為 List<Map<String, String>> List<Map<String, String>> resultList = new ArrayList(); for (Map<String, Object> item : resultJsonList) { Map<String, String> newMap = new HashMap(); for (Map.Entry<String, Object> entry : item.entrySet()) { String key = entry.getKey(); String value = entry.getValue().toString(); newMap.put(key, value); } // 添加resultCode和resultMsg到轉(zhuǎn)換后的結(jié)果 newMap.put("resultCode", resultMap.get("resultCode").toString()); newMap.put("resultMsg", resultMap.get("resultMsg").toString()); resultList.add(newMap); } // 輸出轉(zhuǎn)換后的結(jié)果 for (Map<String, String> item : resultList) { System.out.println("resultCode: " + item.get("resultCode")); System.out.println("resultMsg: " + item.get("resultMsg")); System.out.println("patientName: " + item.get("patientName")); System.out.println("opername: " + item.get("opername")); System.out.println("operdate: " + item.get("operdate")); System.out.println("doctor: " + item.get("doctor")); } return resultList; } catch (IOException e) { // 異常處理 e.printStackTrace(); } return null; } public static List<Map<String, String>> resultMap(String soapResponse) { // 從soapResponse中提取JSON部分 int startIndex = soapResponse.indexOf("<list>"); int endIndex = soapResponse.indexOf("</list>"); String jsonPart = soapResponse.substring(startIndex + "<list>".length(), endIndex); // 將JSON轉(zhuǎn)換為Map ObjectMapper objectMapper = new ObjectMapper(); try { Map<String, Object> resultMap = objectMapper.readValue(jsonPart, new TypeReference<Map<String, Object>>() { }); List<Map<String, Object>> resultJsonList = (List<Map<String, Object>>) resultMap.get("resultJson"); // 轉(zhuǎn)換為 List<Map<String, String>> List<Map<String, String>> resultList = new ArrayList(); for (Map<String, Object> item : resultJsonList) { Map<String, String> newMap = new HashMap(); for (Map.Entry<String, Object> entry : item.entrySet()) { String key = entry.getKey(); String value = entry.getValue().toString(); newMap.put(key, value); } resultList.add(newMap); } return resultList; } catch (IOException e) { // 異常處理 e.printStackTrace(); } return null; } }
到了這里,關(guān)于Java 調(diào)用 WebService 、java調(diào)用Soap請求、Java對接soap接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!