| 裝置支援 | 推薦方案 | 核心工具 | 優勢 | 劣勢 |
|---|---|---|---|---|
| 支援 JSR 172 (Web Services API) | 標準 Stub 生成 | WTK 2.2+ wscompile | 型別安全、標準化、無第三方依賴 | 僅支援簡單型別回傳;複雜型別生成失敗 |
| 不支援 JSR 172 (主流舊機型) | kSOAP 手動構建 | kSOAP 1.x / 2.x | 靈活控制 SOAP 封包、支援複雜型別 | 手工維護協議、易出錯、效能較差 |
陷阱:Web Service 回傳型別若非 WTK 支援的基本型別/陣列/簡單 Bean,Stub 生成會失敗。需協調後端簡化契約。
初期嘗試 kSOAP2 失敗,錯誤指向 kxml.parser 找不到 v11 類別。轉戰 kSOAP 1.x。
soapenc, soapenv (小寫)SOAP-ENC, SOAP-ENV (大寫連字號)org.ksoap.soap.SOAPConstants (或同名類) 中常數定義,強制小寫org.kxml.parser.AbstractXMLParser.startTag() 中 do-while 迴圈邏輯錯誤,導致當前 PrefixMap 後繼節點的命名空間聲明未寫入輸出流,造成封包頭資訊不全。
// 修正後邏輯
do {
String p2 = current.getPrefix();
String ns = current.getNamespace();
if (!ns.equals(oldMap.getNamespace(p2))) {
attribute(p2.equals("") ? "xmlns" : "xmlns:" + p2, ns);
}
current = current.getPrevious();
} while (current != null && current != oldMap);
SOAPConstants.prefixMap 陣列初始化邏輯將 V11 (1999) 與 V12 (2001) 版本命名空間混合,導致 soapenc/soapenv 重複出現。
修正:重構 prefixMap 靜態陣列,明確分離版本,僅保留目標版本 (實測 .NET 需 V11)。
SOAPAction Header 與 WSDL 定義完全一致"namespace/methodName" (如 "https://www.tmp.com/MethodName")call.soapAction = "namespace/methodName"[SoapRpcMethod] 屬性僅 [WebMethod] 不足夠,必須加上 [SoapRpcMethod] 才能正確處理 RPC 編碼風格請求。
今日行動開發呼叫 .NET Core / ASP.NET Core Web API,標準做法是 REST + JSON (Retrofit/OkHttp, HttpClient, URLSession),完全避開 SOAP 複雜性。J2ME 時代的 SOAP 接入經驗,本質是異構系統邊界協議協商的縮影,其核心教訓——契約優先、封包可觀測、版本顯式化——在 gRPC/GraphQL 時代依然適用。