2008-10-15 7 views
221

Je prévois de développer une application pour iPhone et cette application devrait accéder à quelques services SOAP. En faisant quelques vérifications de base dans le SDK iPhone, je n'ai pas trouvé de support pour accéder aux services SOAP, un peu de Google a conduit à la conclusion qu'il n'y a pas de support pour SOAP dans le SDK de l'iPhone. Donc, si je veux construire cette application, je vais devoir trouver une approche pour accéder aux services SOAP à partir de l'iPhone. Quelle serait la meilleure approche? Des meilleures pratiques? Est-ce que quelqu'un a déjà écrit une bibliothèque en utilisant la fonctionnalité présente dans le SDK iPhone pour accéder aux services SOAP?Comment accéder aux services SOAP à partir de l'iPhone

(Depuis le service que je dois accès est exposé par une autre partie et ils exposent que comme SOAP, il est malheureusement pas une option pour passer à un autre type d'interface (par exemple REST API à base).

Gero

+9

Salut Gero, Quel service avez-savon utiliser pour ur application. comme vous n'avez pas mentionné de réponses correctes. – Ameya

+3

Après avoir utilisé le service s'il vous plaît poster les tutoriels pour référence future pour d'autres. –

Répondre

0

Jetez un oeil à here this link et leur feuille de route Ils ont RO |. C sur le chemin, et qui peuvent se connecter à leurs services Web, qui inclut probablement SOAP (j'utilise la version VCL qui inclut certainement)

51

. Un mot: Ne pas

OK, évidemment, ce n'est pas une vraie réponse. Mais encore SOAP devrait être évité à tout prix. ;-) Est-il possible d'ajouter un serveur proxy entre l'iPhone et le service Web? Peut-être quelque chose qui convertit REST en SOAP pour vous?

Vous pouvez essayer CSOAP, une bibliothèque SOAP qui dépend de libxml2 (qui est inclus dans l'iPhone SDK). J'ai écrit mon propre SOAP framework pour OSX. Cependant, il n'est pas maintenu activement et nécessitera un certain temps de port vers l'iPhone (vous devrez remplacer NSXML par TouchXML pour commencer)

+10

Pouvez-vous élaborer sur cette déclaration "Mais toujours SOAP devrait être évitée à tout prix" – WillF

+0

Si cela ne vous dérange pas, j'aimerais vraiment une explication pour aller avec cette réponse. Aussi, quand vous dites "convertit REST en SOAP pour vous", je pense que vous vouliez dire convertir JSON en SOAP. Est-ce correct? – senfo

+2

Ouais, voulant aussi l'explication. Si vous dites simplement "Ne pas", je veux savoir si vous vous basez sur quelque chose de spécifique que vous connaissez sur les problèmes iPhone/SOAP. D'un autre côté, si ce n'est que les raisons générales et normales pour éviter SOAP, je peux Google "SOAP vs REST" et obtenir une bouchée de feu de cela. –

4

J'ai historiquement roulé mon propre accès à un niveau bas (génération XML et analyse) pour répondre au besoin occasionnel de faire des requêtes de style SOAP à partir d'Objective-C. Cela dit, il y a une bibliothèque disponible SOAPClient (soapclient) qui est open source (licence BSD) et disponible sur Google Code (mac-soapclient) qui pourrait être d'intérêt. Je ne vais pas attester de ses capacités ou de son efficacité, car je ne l'ai jamais utilisé ou je devais travailler avec ses API, mais il est disponible et pourrait vous fournir une solution rapide en fonction de vos besoins.

Apple avait, à un moment donné, un utilitaire très brisé appelé WS-MakeStubs. Je ne pense pas que ce soit disponible sur l'iPhone, mais vous pourriez également être intéressé par une bibliothèque open-source destinée à remplacer ce code - générer du code Objective-C pour interagir avec un client SOAP. Encore une fois, je ne l'ai pas utilisé - mais je l'ai marqué dans mes notes: wsdl2objc

+0

Merci, j'ai essayé d'utiliser wsdl2objc. La génération du code ObjectiveC à partir du WSDL fonctionne, mais est (comme prévu) ne compile pas directement sur l'iPhone SDK. J'ai essayé de modifier un peu les sources, mais j'ai fini par avoir un tas d'erreurs que je n'ai pas pu résoudre. – Gero

7

Ma solution était d'avoir un serveur proxy accepter REST, émettre la requête SOAP, et retourner le résultat, en utilisant PHP.

Temps de mise en œuvre: 15-30 minutes.

Pas très élégant, mais solide.

+4

Comment avez-vous fait ça? tous les documents. tnx – Spring

+2

J'aime la mystérieuse non-réponse. comment cela a-t-il été mis à jour? – gdbj

+0

@gdbj parce qu'une conversion 1: 1 entre REST et SOAP devrait être auto-explicative ... –

1

Vous pouvez vous connecter en utilisant un outil que j'ai trouvé 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

Jetez un oeil à gsoap qui comprend deux exemples iOS dans le package de téléchargement sous ios_plugin. L'outil convertit WSDL en code pour SOAP et XML REST.

0

Voici un exemple de code swift 4 qui exécute l'appel API en utilisant le format de service SOAP.

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