如何從iPhone訪問SOAP服務




ios web-services (5)

一個字:不。

很明顯,這不是一個真正的答案。 但是仍然應該不惜一切代價避免使用SOAP。 ;-)是否可以在iPhone和Web服務之間添加代理服務器? 也許是將REST轉換為SOAP的東西?

可以嘗試CSOAP ,這是一個依賴於libxml2(包含在iPhone SDK中)的SOAP庫。

我已經為OSX編寫了自己的SOAP框架 。 然而,它沒有被主動維護,並且需要一些時間才能移植到iPhone(您需要用TouchXML替換NSXML作為開始)

我打算為iPhone開發一個應用程序,該應用程序將不得不訪問幾個SOAP服務。 在iPhone SDK中進行一些基本檢查時,我無法找到任何訪問SOAP服務的支持,但有一點Google導致了iPhone SDK中不支持SOAP的結論。

因此,如果我確實想要構建該應用程序,則需要提供一種從iPhone訪問SOAP服務的方法。 最好的方法是什麼? 任何最佳實踐? 有人已經使用iPhone SDK中提供的功能來編寫庫來訪問SOAP服務嗎?

(由於我需要訪問的服務被另一方公開,並且他們只將它公開為SOAP,所以不幸的是不能切換到另一種類型的接口(例如基於REST的API)。

格羅


以下是一個使用SOAP服務格式執行API調用的快速4示例代碼。

   func callSOAPWSToGetData() {

        let strSOAPMessage =
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                "<soap:Body>" +
                "<CelsiusToFahrenheit xmlns=\"http://www.yourapi.com/webservices/\">" +
                "<Celsius>50</Celsius>" +
                "</CelsiusToFahrenheit>" +
                "</soap:Body>" +
        "</soap:Envelope>"

        guard let url = URL.init(string: "http://www.example.org") else {
            return
        }
        var request = URLRequest.init(url: url)
        let length = (strSOAPMessage as NSString).length
        request.addValue("application/soap+xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.addValue("http://www.yourapi.com/webservices/CelsiusToFahrenheit", forHTTPHeaderField: "SOAPAction")
        request.addValue(String(length), forHTTPHeaderField: "Content-Length")
        request.httpMethod = "POST"
        request.httpBody = strSOAPMessage.data(using: .utf8)

        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)
        let task = session.dataTask(with: request) { (data, response, error) in
            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }
            guard error == nil else {
                print("error calling GET on /todos/1")
                print(error ?? "")
                return
            }
            print(responseData)
            let strData = String.init(data: responseData, encoding: .utf8)
            print(strData ?? "")
        }
        task.resume()
    }

gsoap的下載包中查看包含兩個iOS示例的gsoap。 該工具將WSDL轉換為用於SOAP和XML REST的代碼。


我的解決方案是讓代理服務器接受REST,發出SOAP請求,並使用PHP返回結果。

實施時間:15-30分鐘。

不是最優雅,但堅實。


看看這個鏈接和他們的路線圖。 他們擁有RO | C,並且可以連接到他們的Web服務,這可能包括SOAP(我使用的VCL版本肯定包含它)。





wsdl