web-dev-qa-db-fra.com

Comment accéder aux services SOAP à partir de l'iPhone

Je prévois de développer une application pour iPhone et cette application devrait accéder à quelques services SOAP. Lors de la vérification de base du kit de développement logiciel (SDK) pour iPhone, je n’étais pas en mesure de trouver un support pour accéder aux services SOAP, un peu de recherche sur Google a permis de conclure qu’il n’existait aucun support pour SOAP in le SDK de l'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 meilleures pratiques? Quelqu'un a-t-il déjà écrit une bibliothèque à l'aide de la fonctionnalité présente dans le SDK de l'iPhone pour accéder aux services SOAP?

(Étant donné que le service auquel je dois accéder est exposé par une autre partie et qu'il ne l'expose que sous forme de SOAP, ce n'est malheureusement pas une option pour passer à un autre type d'interface (par exemple, une API basée sur REST)).

Gero

224
Gero

Un mot: non.

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

Vous pourriez essayer CSOAP , une bibliothèque SOAP qui dépend de libxml2 (qui est inclus dans le kit de développement iPhone).

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

52
schwa

Ma solution consistait à faire accepter par REST un serveur proxy, à émettre la demande SOAP, et à renvoyer le résultat à l'aide de PHP.

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

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

7
davidjhinson

J'ai toujours utilisé mon propre accès de bas niveau (génération et analyse XML) pour faire face au besoin occasionnel d'effectuer des demandes de style SOAP à partir d'Objective-C. Cela dit, il existe une bibliothèque appelée SOAPClient ( soapclient ), à code source ouvert (sous licence BSD) et disponible sur Google Code ( mac-soapclient ) qui pourrait être intéressante.

Je ne vais pas attester de ses capacités ou de son efficacité, car je ne l'ai jamais utilisé ni travaillé avec ses API, mais il est disponible et peut constituer une solution rapide pour vous, en fonction de vos besoins.

Apple avait, à un moment donné, un utilitaire très défectueux 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 - le code généré par 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

4
heckj

Voici un exemple de code Swift 4 exécutant 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()
    }
2
Tech

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

Regardez gsoap qui inclut 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
Dr. Alex RE

Regardez ici ce lien et leur feuille de route. Ils ont RO | C en route et peuvent se connecter à leurs services Web, ce qui inclut probablement SOAP (j'utilise la version VCL qui l'inclut définitivement).

0
mj2008