2008-10-15 6 views
221

Ich plane, eine App für das iPhone zu entwickeln, und diese App müsste auf einige SOAP-Dienste zugreifen. Während einige grundlegende Überprüfung im iPhone SDK ich keine Unterstützung für den Zugriff auf SOAP-Dienste finden konnte, führen ein wenig Googeln zu der Schlussfolgerung, dass es keine Unterstützung für SOAP im iPhone SDK gibt.Zugriff auf SOAP-Dienste über das iPhone

Also wenn ich diese App erstellen möchte, muss ich einen Ansatz für den Zugriff auf SOAP-Dienste vom iPhone kommen. Was wäre der beste Ansatz? Irgendwelche Best Practices? Hat jemand bereits eine Bibliothek geschrieben, die die im iPhone SDK vorhandene Funktionalität verwendet, um auf SOAP-Dienste zuzugreifen?

(Da der Service, den ich zugreifen müssen von einer anderen Partei ausgesetzt ist und sie es nur als SOAP aussetzen, es ist leider keine Option auf eine andere Art der Schnittstelle zu wechseln (zB REST-basierte API).

Gero

+9

Hallo Gero, Welche Seife Service haben Sie für die ur-Anwendung verwenden. wie du keine richtigen Antworten erwähnt hast. – Ameya

+3

Nachdem Sie den Service verwendet haben, veröffentlichen Sie die Anleitungen für die zukünftige Referenz für Andere. –

Antwort

0

Werfen sie einen Blick auf here this link und ihre Roadmap sie RO haben |. C auf dem Weg, und dass auf ihre Web-Services eine Verbindung herstellen können, die wahrscheinlich SOAP enthält (I die VCL-Version verwenden, die es auf jeden Fall enthält)

51

. Ein Wort: Nicht.

OK, das ist natürlich keine richtige Antwort. Aber trotzdem sollte SOAP um jeden Preis vermieden werden. ;-) Ist es möglich einen Proxy-Server zwischen dem iPhone und dem Web-Service hinzuzufügen? Vielleicht etwas, das REST für Sie in SOAP umwandelt?

Sie könnte versuchen CSOAP, eine SOAP-Bibliothek, die auf libxml2 (die im iPhone SDK enthalten ist) abhängt.

Ich habe meine eigene SOAP framework für OSX geschrieben. Es wird jedoch nicht aktiv gepflegt und benötigt etwas Zeit, um auf das iPhone zu portieren (Sie müssen NSXML durch TouchXML für einen Start ersetzen)

+10

Können Sie auf diese Aussage näher eingehen "Aber dennoch sollte SOAP um jeden Preis vermieden werden" – WillF

+0

Wenn es Ihnen nichts ausmacht, würde ich gerne eine Erklärung, um mit dieser Antwort zu gehen. Wenn Sie "REST in SOAP für Sie konvertieren" sagen, sollten Sie JSON in SOAP konvertieren. Ist das richtig? – senfo

+2

Ja, will auch die Erklärung. Wenn Sie nur "Do not" sagen, möchte ich wissen, ob Sie auf etwas Bestimmtes basieren, das Sie über iPhone/SOAP-Probleme wissen. Auf der anderen Seite, wenn es nur die normalen, allgemeinen Gründe für die Vermeidung von SOAP ist, kann ich Google "SOAP vs REST" googlen und bekomme einen Schuss davon. –

4

Ich habe in der Vergangenheit meinen eigenen Zugriff auf einem niedrigen Niveau (XML-Generation und Parsen), um die gelegentliche Anforderung von SOAP-Style-Requests von Objective-C zu bearbeiten. Das heißt, es gibt eine Bibliothek namens SOAPClient (soapclient), die Open Source (BSD-lizenziert) und auf Google-Code (mac-soapclient) verfügbar ist, die von Interesse sein könnte.

Ich werde nicht seine Fähigkeiten oder Effektivität bescheinigen, da ich es nie benutzt habe oder mit seinen APIs arbeiten musste, aber es ist verfügbar und könnte eine schnelle Lösung für Sie bieten, abhängig von Ihren Bedürfnissen.

Apple hatte auf 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 das ersetzen soll - Code generieren Objective-C für die Interaktion mit einem SOAP-Client. Wieder habe ich es nicht verwendet - aber ich habe es in meinen Notizen markiert: wsdl2objc

+0

Danke, ich habe versucht, wsdl2objc zu verwenden. Die Generierung von ObjectiveC-Code aus der WSDL funktioniert, wird aber (wie erwartet) nicht direkt mit dem iPhone SDK kompiliert. Ich habe versucht, die Quellen ein wenig zu optimieren, aber endete mit einer Reihe von Fehlern, die ich nicht lösen konnte. – Gero

7

Meine Lösung war es, einen Proxy-Server REST zu akzeptieren, die SOAP-Anfrage ausgeben und Ergebnis zurückgeben, mit PHP.

Zeit zu implementieren: 15-30 Minuten.

Nicht sehr elegant, aber solide.

+4

Wie hast du das gemacht? irgendwelche Dokumente. tnx – Spring

+2

Ich liebe die mysteriöse Nicht-Antwort. Wie wurde das verbessert? – gdbj

+0

@ Gdbj, weil eine 1: 1-Konvertierung zwischen REST und SOAP sollte sich selbst erklären ... –

1

können Sie verbinden mit einem Werkzeug, das ich http://www.wsdl2code.com

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]; 
0

bei gsoap Werfen Sie einen Blick gefunden, die zwei iOS Beispiele im Download-Paket unter ios_plugin enthält. Das Tool konvertiert WSDL in Code für SOAP und XML REST.

0

Hier ist ein swift 4 Beispielcode, die API-Aufruf mit SOAP-Service-Format ausführen.

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() 
    }