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

Java 純代碼調用 WebService 獲取 XML 資料並本地保存

     編輯:Java 相關知識

場景說明

無需引入 CXF、Axis2 等重型框架,僅使用 JDK 內建 java.net 與 javax.xml 套件,即可完成 SOAP/REST 呼叫、XML 解析與序列化存檔。

核心流程

  1. 建立 URL 連線,設定必要 Header(如 Host、Content-Type、SOAPAction)。
  2. 取得 InputStream,交給 DocumentBuilder 解析為 DOM 樹。
  3. 使用 Transformer 將 DOM 輸出為格式化 XML 檔案。

完整實作

package webservice;

import org.w3c.dom.Document;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.net.*;

public class SimpleWebServiceClient {
    private static final String SERVICE_HOST = "www.example.com";
    private static final String ENDPOINT_URL = "https://www.example.com/ws/dataService?wsdl";
    private static final String OUTPUT_FILE = "data/response.xml";

    public static void main(String[] args) {
        try {
            Document doc = fetchXml(ENDPOINT_URL);
            saveXml(doc, OUTPUT_FILE);
            System.out.println("XML 已保存至:" + OUTPUT_FILE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static Document fetchXml(String urlStr) throws Exception {
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET"); // 或 POST
        conn.setRequestProperty("Host", SERVICE_HOST);
        conn.setRequestProperty("Accept", "application/xml");
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(10000);

        int responseCode = conn.getResponseCode();
        if (responseCode != 200) {
            throw new RuntimeException("HTTP 錯誤:" + responseCode);
        }

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true); // 支援命名空間
        DocumentBuilder builder = dbf.newDocumentBuilder();
        return builder.parse(conn.getInputStream());
    }

    private static void saveXml(Document doc, String filePath) throws TransformerException, FileNotFoundException {
        File outFile = new File(filePath);
        outFile.getParentFile().mkdirs();

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{https://xml.apache.org/xslt}indent-amount", "2");

        try (FileOutputStream fos = new FileOutputStream(outFile)) {
            transformer.transform(new DOMSource(doc), new StreamResult(fos));
        }
    }
}

關鍵細節補充

  • SOAP 請求:若為 SOAP,需組裝完整 Envelope XML,以 POST 發送,並設定 Content-Type: text/xml;charset=UTF-8 及 SOAPAction Header。
  • 命名空間處理:setNamespaceAware(true) 確保 XPath/解析正確識別前綴。
  • 大檔案串流:回應超大時,改用 StAX (XMLStreamReader) 或 SAX 事件驅動解析,避免 DOM 佔用過多記憶體。
  • 錯誤處理:區分連線異常、HTTP 錯誤碼、XML 格式錯誤,分別記錄日誌與重試策略。

現代替代方案

JDK 11+ 提供 HttpClient(java.net.http),支援非同步、HTTP/2、WebSocket,語法更現代:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(ENDPOINT_URL))
    .header("Accept", "application/xml")
    .GET()
    .build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 解析 response.body()...

總結

純 JDK 呼叫 WebService 適合輕量級、無依賴需求的場景。理解底層 HTTP 與 XML 處理流程,有助於排查框架封裝下的疑難雜症。生產系統建議採用成熟框架(CXF, Spring WebService)或現代 HttpClient 以獲得更好的連線池、重試、攔截器等企業級特性。

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