iOS 專案使用 Alamofire 呼叫 C# 舊式 ASMX Web Service(非 WCF/REST),直接 POST JSON 失敗,回傳 HTTP 500 與 HTML 錯誤頁面,而非預期 JSON。
ASMX 預期 **SOAP 協定**(XML 格式),而非裸 JSON。Android 端可能已自行組裝 SOAP 封包,或伺服器端有額外處理。iOS 端需依照 SOAP 規範發送請求。
func callASMXService() {
let urlString = "https://115.29.41.12:83/serForImccoy.asmx"
let action = "https://imccoy.com/webservices/isUser"
let soapMessage = buildSoapMessage(method: "isUser", params: ["userId": "test", "pwd": "pwd"])
var request = URLRequest(url: URL(string: urlString)!)
request.httpMethod = "POST"
request.setValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") // 關鍵:ASMX 需 text/xml
request.setValue(action, forHTTPHeaderField: "SOAPAction")
request.setValue("\(soapMessage.utf8.count)", forHTTPHeaderField: "Content-Length")
request.httpBody = soapMessage.data(using: .utf8)
AF.request(request).responseString { response in
switch response.result {
case .success(let xmlString):
print("原始 XML 回應:\(xmlString)")
// 解析 XML 取得結果
case .failure(let error):
print("請求失敗:\(error)")
}
}
}
func buildSoapMessage(method: String, params: [String: String]) -> String {
var xml = ""
xml += ""
xml += ""
xml += "<\(method) xmlns=\"https://imccoy.com/webservices/\">"
for (key, value) in params {
xml += "<\(key)>\(value)\(key)>"
}
xml += "\(method)>"
xml += " "
xml += " "
return xml
}
text/xml; charset=utf-8,而非 application/json 或 application/soap+xml(ASMX 1.0 不支援 SOAP 1.2)。<方法名> 子元素中。XMLParser 或第三方庫(如 AEXML、SWXMLHash)解析。AF.request(..., parameters: ..., encoder: JSONParameterEncoder.default)。Alamofire 搭配 SOAPEngine 等第三方庫自動處理 SOAP 序列化。正確組裝 SOAP 封包並設定正確 Header,即可順利串接舊版 ASMX 服務。