無需引入 CXF、Axis2 等重型框架,僅使用 JDK 內建 java.net 與 javax.xml 套件,即可完成 SOAP/REST 呼叫、XML 解析與序列化存檔。
URL 連線,設定必要 Header(如 Host、Content-Type、SOAPAction)。InputStream,交給 DocumentBuilder 解析為 DOM 樹。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));
}
}
}
Content-Type: text/xml;charset=UTF-8 及 SOAPAction Header。setNamespaceAware(true) 確保 XPath/解析正確識別前綴。XMLStreamReader) 或 SAX 事件驅動解析,避免 DOM 佔用過多記憶體。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 以獲得更好的連線池、重試、攔截器等企業級特性。