So greifen Sie vom iPhone auf SOAP-Dienste zu

224

Ich plane, eine App für das iPhone zu entwickeln, und diese App müsste auf einige SOAP-Dienste zugreifen. Während ich einige grundlegende Überprüfungen im iPhone SDK durchführte, konnte ich keine Unterstützung für den Zugriff auf SOAP-Dienste finden. Ein bisschen Googeln führte zu dem Schluss, dass SOAP im iPhone SDK nicht unterstützt wird.

Wenn ich diese App erstellen möchte, muss ich einen Ansatz für den Zugriff auf SOAP-Dienste vom iPhone aus entwickeln. Was wäre der beste Ansatz? Best Practices? Hat jemand bereits eine Bibliothek mit den im iPhone SDK vorhandenen Funktionen für den Zugriff auf SOAP-Dienste geschrieben?

(Da der Dienst, auf den ich zugreifen muss, von einer anderen Partei bereitgestellt wird und diese nur als SOAP verfügbar gemacht wird, ist es leider keine Option, zu einem anderen Schnittstellentyp (z. B. REST-basierte API) zu wechseln.

Gero

Gero
quelle
9
Hallo Gero, welchen Seifenservice hast du für deine Anwendung benutzt? wie du keine richtigen Antworten erwähnt hast.
Ameya
3
Nachdem Sie den Service genutzt haben, veröffentlichen Sie die Tutorials zur späteren Bezugnahme für andere.
Vineesh TP

Antworten:

52

Ein Wort: Nicht.

OK, das ist natürlich keine echte Antwort. Trotzdem sollte SOAP um jeden Preis vermieden werden. ;-) Ist es möglich, einen Proxyserver zwischen dem iPhone und dem Webdienst hinzuzufügen? Vielleicht etwas, das REST für Sie in SOAP umwandelt?

Sie können CSOAP ausprobieren , eine SOAP-Bibliothek, die von libxml2 abhängt (das im iPhone SDK enthalten ist).

Ich habe mein eigenes SOAP-Framework für OSX geschrieben. Es wird jedoch nicht aktiv gewartet und benötigt einige Zeit, um auf das iPhone zu portieren (Sie müssen zunächst NSXML durch TouchXML ersetzen ).

Schwa
quelle
11
Können Sie diese Aussage
näher erläutern?
9
Nur weil Seife nicht unbedingt angemessen ist, heißt das nicht, dass sie in seiner Implementierung nicht richtig ist. Es gibt Bedürfnisse, die öfter über die Best Practices hinausgehen als nicht
Anthony Main
11
@schwa - Für die Veröffentlichung einer potenziell nützlichen Antwort ohne Belege oder Verteidigung abgelehnt.
DougW
12
Dies ist das technische Äquivalent zu "Nicht verwenden, da es nicht standardmäßig bereitgestellt wird". Es gibt keinen wirklichen technischen Grund, warum Sie SOAP oder einen anderen von einem Dienst bereitgestellten Mechanismus nicht verwenden sollten.
Petesh
9
Hier ist zumindest eine Antwort: SOAP ist im Vergleich zu REST ein Protokoll mit sehr hohem Overhead. Alle Namespace- und Gültigkeitsprüfungen und dergleichen fügen Ihrer Nachricht eine Menge zusätzlicher Zeichen hinzu. Genau dies möchten Sie in einem möglicherweise langsamen Netzwerk mit hoher Latenz wie 3G vermeiden. Wenn Sie garantieren können, dass Ihre App nur in einer 4g-Umgebung mit hervorragendem Signal oder nur in Wifi verwendet wird, ist sie möglicherweise angemessener. Im Allgemeinen ist weniger bei mobilen Netzwerken mehr.
Vineel Shah
7

Meine Lösung bestand darin, dass ein Proxyserver REST akzeptiert, die SOAP-Anforderung ausgibt und das Ergebnis mithilfe von PHP zurückgibt.

Implementierungszeit: 15-30 Minuten.

Nicht besonders elegant, aber solide.

Davidjhinson
quelle
4
Wie hast du das gemacht? irgendwelche Dokumente. tnx
Frühling
3
Ich liebe die mysteriöse Nichtantwort. Wie wurde das positiv bewertet?
GDBJ
@gdbj, weil eine 1: 1-Konvertierung zwischen REST und SOAP selbsterklärend sein sollte ...
Magic Octopus Urn
1
Das ist das Was, beantwortet aber nicht die Frage nach dem Wie, weshalb die Leute hierher kommen. Ich bin immer noch gespannt auf die Antwort, wie die Implementierung hier aussehen würde, besonders wenn es so einfach ist.
GDBJ
4

Ich habe meinen eigenen Zugriff in der Vergangenheit auf einer niedrigen Ebene (XML-Generierung und -Parsing) gerollt, um die gelegentliche Notwendigkeit zu bewältigen, SOAP-Stilanforderungen von Objective-C auszuführen. Es gibt jedoch eine Bibliothek namens SOAPClient ( soapclient ), die Open Source (BSD-lizenziert) ist und auf Google Code ( mac-soapclient ) verfügbar ist und möglicherweise von Interesse ist.

Ich werde seine Fähigkeiten oder Effektivität nicht bestätigen, da ich es nie verwendet habe oder mit seinen APIs arbeiten musste, aber es ist verfügbar und bietet Ihnen je nach Ihren Anforderungen möglicherweise eine schnelle Lösung.

Apple hatte einmal ein sehr kaputtes Dienstprogramm namens WS-MakeStubs. Ich glaube nicht, dass es auf dem iPhone verfügbar ist, aber Sie könnten auch an einer Open-Source-Bibliothek interessiert sein, die dies ersetzen soll - Code generiert Objective-C für die Interaktion mit einem SOAP-Client. Ich habe es wieder nicht benutzt - aber ich habe es in meinen Notizen vermerkt: wsdl2objc

heckj
quelle
Danke, ich habe versucht, wsdl2objc zu verwenden. Die Generierung von ObjectiveC-Code aus der WSDL funktioniert, wird jedoch (wie erwartet) nicht direkt mit dem iPhone SDK kompiliert. Ich habe versucht, die Quellen ein wenig zu optimieren, aber am Ende gab es eine Reihe von Fehlern, die ich nicht beheben konnte
Gero
2

Sie können eine Verbindung mit einem Tool herstellen, das ich unter http://www.wsdl2code.com gefunden habe

SampleServiceProxy *proxy = [[SampleServiceProxy alloc]initWithUrl:@"YOUR
        URL" AndDelegate:self];

[proxy GetDouble];
[proxy GetEnum];
[proxy getEnum:kTestEnumTestEnum2];
[proxy GetInt16];
[proxy GetInt32];
[proxy GetInt64];
[proxy GetString];
[proxy getListStrings];
Bennya
quelle
2

Hier ist ein schneller 4- Beispielcode, der API-Aufrufe im SOAP-Dienstformat ausführt.

   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()
    }
Technik
quelle
0

Schauen Sie sich hier diesen Link und ihre Roadmap an. Sie haben RO | C auf dem Weg, und das kann eine Verbindung zu ihren Webdiensten herstellen, die wahrscheinlich SOAP enthalten (ich verwende die VCL-Version, die es definitiv enthält).

mj2008
quelle
0

Schauen Sie sich gsoap an , das zwei iOS-Beispiele im Download-Paket unter ios_plugin enthält. Das Tool konvertiert WSDL in Code für SOAP und XML REST.

Dr. Alex RE
quelle