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

Android 呼叫 WebService 傳送 DataSet:SOAP XML 手工組裝實戰

     編輯:程式設計綜合問答

核心難點

Android 端無原生 DataSet 類別,需自行將資料序列化為符合 .NET WebService 預期的 SOAP XML 格式。

實作步驟

  1. 先用 C# 客戶端呼叫:在 Visual Studio 加入 Web 參考,呼叫目標方法傳送 DataSet。
  2. 抓取 SOAP 請求:使用 Fiddler 或 Wireshark 攔截 HTTP 封包,複製完整的 SOAP Envelope XML。
  3. 分析 XML 結構:觀察 diffgr:diffgram、xs:schema、資料列結構 (<Table><Column>value</Column></Table>)。
  4. Android 端字串組裝:依樣畫葫蘆,用 StringBuilder 動態產生相同結構 XML。
  5. 發送 HTTP POST:設定 Content-Type: text/xml; charset=utf-8,加入 SOAPAction 標頭,將 XML 字串寫入請求本體。

程式碼範例

public String sendDataSet(List<Map<String, Object>> data) {
    StringBuilder soap = new StringBuilder();
    soap.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
    soap.append("<soap:Envelope xmlns:soap=\"https://schemas.xmlsoap.org/soap/envelope/\" ");
    soap.append("xmlns:xsi=\"https://www.w3.org/2001/XMLSchema-instance\" ");
    soap.append("xmlns:xsd=\"https://www.w3.org/2001/XMLSchema\">");
    soap.append("<soap:Body>");
    soap.append("<YourMethodName xmlns=\"https://tempuri.org/\">");
    soap.append("<dataSet>");

    // 這裡需依實際 schema 產生 diffgram
    soap.append("<diffgr:diffgram xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" ");
    soap.append("xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\">");
    soap.append("<NewDataSet xmlns=\"\">");

    for (Map<String, Object> row : data) {
        soap.append("<Table diffgr:id=\"Table1\" msdata:rowOrder=\"0\">");
        for (Map.Entry<String, Object> col : row.entrySet()) {
            soap.append("<").append(col.getKey()).append(">")
                .append(escapeXml(col.getValue().toString()))
                .append("</").append(col.getKey()).append(">");
        }
        soap.append("</Table>");
    }

    soap.append("</NewDataSet></diffgr:diffgram>");
    soap.append("</dataSet></YourMethodName></soap:Body></soap:Envelope>");

    return postSoapRequest(soap.toString());
}

private String escapeXml(String s) {
    return s.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
            .replace("\"", "&quot;").replace("'", "&apos;");
}

注意事項

  • 命名空間必須完全一致:任何 xmlns 差異都會導致伺服器反序列化失敗。
  • 日期時間格式:.NET 預期 yyyy-MM-ddTHH:mm:ss (ISO 8601)。
  • 大小寫敏感:元素與屬性名稱大小寫需與 schema 完全對應。
  • 替代方案:若可控制伺服器端,建議改用 JSON + REST API,大幅降低複雜度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved