Comment accéder aux services SOAP depuis l'iPhone

224

Je prévois de développer une application pour l'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 pu trouver de support pour accéder aux services SOAP, un peu de recherche sur Google a permis de conclure qu'il n'y a pas de support pour SOAP dans le SDK iPhone.

Donc, si je veux créer cette application, je devrai proposer une approche pour accéder aux services SOAP à partir de l'iPhone. Quelle serait la meilleure approche? Des bonnes pratiques? Quelqu'un a-t-il déjà écrit une bibliothèque à l'aide des fonctionnalités présentes dans le SDK iPhone pour accéder aux services SOAP?

(Étant donné que le service auquel j'ai besoin d'accéder est exposé par une autre partie et qu'ils l'exposent uniquement en tant que SOAP, ce n'est malheureusement pas une option pour passer à un autre type d'interface (par exemple, une API basée sur REST).

Gero

Gero
la source
9
Salut Gero, quel service de savon avez-vous utilisé pour votre application. comme vous n'avez pas mentionné de réponses correctes.
Ameya
3
Après avoir utilisé le service, veuillez publier les didacticiels pour référence future pour les autres.
Vineesh TP

Réponses:

52

Un mot: non.

OK, évidemment, ce n'est pas une vraie réponse. Mais le savon doit toujours ê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 incluse dans le SDK iPhone).

J'ai écrit mon propre framework SOAP pour OSX. Cependant, il n'est pas activement maintenu et nécessitera un certain temps pour être porté sur l'iPhone (vous devrez remplacer NSXML par TouchXML pour commencer)

schwa
la source
11
Pouvez-vous élaborer sur cette déclaration "Mais le savon devrait toujours être évité à tout prix"
WillF
9
Le fait que le savon ne soit pas nécessairement approprié ne signifie pas qu'il ne convient pas dans sa mise en œuvre, il y a des besoins qui vont au-delà des meilleures pratiques le plus souvent
Anthony Main
11
@schwa - A voté pour avoir publié une réponse potentiellement utile sans aucune preuve ni défense à l'appui.
DougW
12
Il s'agit de l'équivalent technique de "Ne pas l'utiliser car il n'est pas fourni par défaut" - Il n'y a pas de véritable raison technique pour laquelle vous ne devriez pas utiliser SOAP ou tout autre mécanisme fourni par un service.
Petesh
9
Voici au moins une réponse - SOAP est un protocole à très haut débit par rapport à REST. Tous les espaces de noms et vérifications de validité et autres ajoutent une tonne de caractères supplémentaires à votre message, et c'est exactement ce que vous voulez éviter sur un réseau à latence élevée et potentiellement lent, comme la 3G. Si vous pouvez garantir que votre application ne sera utilisée que dans un environnement 4G avec un excellent signal, ou uniquement en Wifi, cela pourrait être plus approprié. Mais en général avec les réseaux mobiles, moins c'est plus.
Vineel Shah
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 le plus élégant, mais solide.

davidjhinson
la source
4
Comment tu as fait ça? tous les documents. tnx
Printemps
3
J'adore la mystérieuse non-réponse. comment cela a-t-il été voté?
gdbj
@gdbj car une conversion 1: 1 entre REST et SOAP devrait s'expliquer d'elle-même ...
Magic Octopus Urn
1
C'est le Quoi, mais ne répond pas à la question de savoir comment, c'est pourquoi les gens viennent ici. Je suis toujours curieux de savoir quelle serait la mise en œuvre ici, surtout si elle est si simple.
gdbj
4

Historiquement, j'ai roulé mon propre accès à un bas niveau (génération et analyse XML) pour faire face au besoin occasionnel de faire des requêtes de style SOAP à partir d'Objective-C. Cela dit, il existe une bibliothèque appelée SOAPClient ( soapclient ) qui est open source (licence BSD) et disponible sur Google Code ( mac-soapclient ) qui pourrait être intéressante.

Je n'attesterai pas de ses capacités ou de son efficacité, car je ne l'ai jamais utilisé ou j'ai dû 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 cassé appelé WS-MakeStubs. Je ne pense pas qu'il soit disponible sur l'iPhone, mais vous pourriez également être intéressé par une bibliothèque open source destinée à remplacer cela - du code génère Objective-C pour interagir avec un client SOAP. Encore une fois, je ne l'ai pas utilisé - mais je l'ai noté dans mes notes: wsdl2objc

heckj
la source
Merci, j'ai essayé d'utiliser wsdl2objc. La génération de code ObjectiveC à partir du WSDL fonctionne, mais est (comme prévu) ne se compile pas directement avec le SDK iPhone. J'ai essayé de modifier un peu les sources, mais je me suis retrouvé avec un tas d'erreurs que je n'ai pas pu résoudre
Gero
2

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];
Bennya
la source
2

Voici un exemple de code swift 4 qui exécute des appels d'API à l'aide du 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()
    }
Technologie
la source
0

Jetez un œil ici à ce lien et à leur feuille de route. Ils ont RO | C sur le chemin, et qui peuvent se connecter à leurs services Web, qui incluent probablement SOAP (j'utilise la version VCL qui l'inclut définitivement).

mj2008
la source
0

Jetez un œil à 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.

Dr. Alex RE
la source