首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Axis 發送 XML 報文並解析回應完整實戰

     編輯:Java 綜合教學

專案依賴

需引入 Axis 相關 JAR(axis.jar、jaxrpc.jar、saaj.jar、wsdl4j.jar、commons-logging.jar、commons-discovery.jar)。

核心流程三步驟

  1. 構造請求 XML 字串
  2. 透過 Axis Call API 發送 SOAP 請求
  3. 解析回應 XML 提取業務數據

完整代碼實作

public class AxisXmlClient {

    /** 發送報文並獲取回應 */
    public String sendRequest(String requestXml, String endpoint, String namespace, String methodName) 
            throws Exception {
        Service service = new Service();
        Call call = (Call) service.createCall();
        
        call.setTargetEndpointAddress(endpoint);
        call.setOperationName(new QName(namespace, methodName));
        call.addParameter("parameters", 
            new QName(namespace, methodName), 
            ParameterMode.IN);
        call.setReturnType(XMLType.XSD_STRING);
        
        String response = (String) call.invoke(new Object[]{requestXml});
        return response;
    }

    /** 解析回應 XML 為 Map */
    @SuppressWarnings("unchecked")
    public Map parseResponse(String xml) throws Exception {
        Map result = new HashMap<>();
        Document doc = parseXmlString(xml);
        Element root = doc.getDocumentElement();

        // 解析 body 部分(含 CDATA)
        Node bodyNode = root.getElementsByTagName("body").item(0);
        if (bodyNode != null) {
            String bodyXml = bodyNode.getTextContent(); // 取出 CDATA 內容
            Document bodyDoc = parseXmlString(bodyXml);
            extractBusinessData(bodyDoc, result);
        }

        // 解析 head 返回碼
        parseHead(root, result);
        return result;
    }

    private Document parseXmlString(String xml) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        return builder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
    }

    private void extractBusinessData(Document doc, Map map) {
        Element root = doc.getDocumentElement();
        NodeList children = root.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node node = children.item(i);
            if (node instanceof Element) {
                traverseNode((Element) node, map);
            }
        }
    }

    private void traverseNode(Element element, Map map) {
        String name = element.getNodeName();
        if (element.getChildNodes().getLength() == 1 
                && element.getFirstChild().getNodeType() == Node.TEXT_NODE) {
            map.put(name, element.getTextContent().trim());
        }
        NodeList list = element.getChildNodes();
        for (int i = 0; i < list.getLength(); i++) {
            if (list.item(i) instanceof Element) {
                traverseNode((Element) list.item(i), map);
            }
        }
    }

    private void parseHead(Element root, Map map) {
        Node headNode = root.getElementsByTagName("head").item(0);
        if (headNode == null) return;
        NodeList list = headNode.getChildNodes();
        for (int i = 0; i < list.getLength(); i++) {
            Node n = list.item(i);
            if ("rtn_msg".equals(n.getNodeName())) {
                NodeList msgList = n.getChildNodes();
                for (int j = 0; j < msgList.getLength(); j++) {
                    Node m = msgList.item(j);
                    if (m instanceof Element) {
                        map.put(m.getNodeName(), m.getTextContent().trim());
                    }
                }
            }
        }
    }
}

使用範例

public static void main(String[] args) throws Exception {
    String requestXml = ""
        + ""
        + "  ..."
        + "  "
        + "";

    AxisXmlClient client = new AxisXmlClient();
    String response = client.sendRequest(
        requestXml,
        "https://target-host:port/services/TargetService",
        "https://target-namespace",
        "doService"
    );
    
    Map data = client.parseResponse(response);
    System.out.println("解析結果:" + data);
}

關鍵技術點總結

  • CDATA 處理:body 內容常被 CDATA 包裹,需先 getTextContent() 取出再二次解析
  • 命名空間:啟用 setNamespaceAware(true) 正確處理 xmlns
  • 編碼統一:請求/回應/解析全鏈路使用 UTF-8
  • 異常處理:網路超時、XML 格式錯誤、業務返回碼非 0 皆需捕獲

現代替代建議

新專案建議使用 CXF、Spring WebServiceTemplate 或 HttpClient + DOM/SAX,Axis 1.x 已停止維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved