Come accedere ai servizi SOAP da iPhone


224

Sto progettando di sviluppare un'app per iPhone e tale app dovrebbe accedere a un paio di servizi SOAP. Mentre eseguivo alcuni controlli di base nell'SDK dell'iPhone non sono riuscito a trovare alcun supporto per l'accesso ai servizi SOAP, un po 'di googling ha portato alla conclusione che non c'è supporto per SOAP nell'SDK dell'iPhone.

Quindi, se voglio creare quell'app, dovrò trovare un approccio per accedere ai servizi SOAP dall'iPhone. Quale sarebbe l'approccio migliore? Qualche migliore pratica? Qualcuno ha già scritto una libreria utilizzando la funzionalità presente nell'SDK di iPhone per accedere ai servizi SOAP?

(Poiché il servizio a cui devo accedere è esposto da un'altra parte e lo espongono solo come SOAP, sfortunatamente non è un'opzione per passare a un altro tipo di interfaccia (ad esempio API basate su REST).

Gero


9
Ciao Gero, che sapone hai usato per la tua applicazione. poiché non hai menzionato alcuna risposta corretta.
Ameya,

3
Dopo aver utilizzato il servizio, pubblicare le esercitazioni per riferimento futuro per gli altri.
Vineesh TP,

Risposte:


52

Una sola parola: non farlo.

OK ovviamente non è una vera risposta. Ma comunque SOAP dovrebbe essere evitato a tutti i costi. ;-) È possibile aggiungere un server proxy tra l'iPhone e il servizio web? Forse qualcosa che converte REST in SAPONE per te?

Si potrebbe provare a CSOAP , una libreria SOAP che dipende libxml2 (che è incluso in iPhone SDK).

Ho scritto il mio framework SOAP per OSX. Tuttavia, non viene mantenuto attivamente e richiederà un po 'di tempo per il port su iPhone ( per iniziare dovrai sostituire NSXML con TouchXML )


11
Puoi approfondire questa affermazione "Ma comunque SOAP dovrebbe essere evitato a tutti i costi"
WillF

9
Solo perché il sapone non è necessariamente appropriato non significa che non sia giusto nella sua implementazione, ci sono bisogni che vanno oltre la migliore pratica il più delle volte
Anthony Main,

11
@schwa - Sottovalutato per aver pubblicato una risposta potenzialmente utile senza assolutamente prove o difese a sostegno.
DougW,

12
Questo è l'equivalente tecnico di "Non utilizzarlo perché non è fornito per impostazione predefinita" - Non esiste alcun motivo tecnico reale per cui non si dovrebbe usare SOAP o qualsiasi altro meccanismo fornito da un servizio.
Petesh,

9
Ecco almeno una risposta: SOAP è un protocollo molto elevato rispetto a REST. Tutto lo spazio dei nomi e il controllo di validità e simili aggiungono un sacco di caratteri extra al tuo messaggio, e questo è esattamente ciò che vuoi evitare su una rete ad alta latenza, potenzialmente lenta, come 3G. Se puoi garantire che la tua app verrà utilizzata solo in un ambiente 4g con un segnale eccellente o solo in Wifi, potrebbe essere più adatta. Ma in generale con le reti mobili, meno è di più.
Vineel Shah,

7

La mia soluzione era di fare in modo che un server proxy accettasse REST, emettesse la richiesta SOAP e restituisse il risultato, usando PHP.

Tempo di attuazione: 15-30 minuti.

Non molto elegante, ma solido.


4
Come hai fatto? qualsiasi documento. tnx
primavera

3
Adoro la misteriosa non risposta. come è stato votato?
gdbj,

@gdbj perché una conversione 1: 1 tra REST e SOAP dovrebbe essere autoesplicativa ...
Magic Octopus Urn

1
Questo è il Cosa, ma non risponde alla domanda su Come, ecco perché le persone vengono qui. Sono ancora curioso di sapere quale sarebbe l'implementazione qui, in particolare se è così semplice.
gdbj,

4

Ho storicamente rotolato il mio accesso a un livello basso (generazione e analisi XML) per far fronte all'occasionale necessità di fare richieste di stile SOAP da Objective-C. Detto questo, c'è una libreria disponibile chiamata SOAPClient ( soapclient ) che è open source (licenza BSD) e disponibile su Google Code ( mac-soapclient ) che potrebbe essere di interesse.

Non attesterò le sue capacità o efficacia, poiché non l'ho mai usato o non ho dovuto lavorare con le sue API, ma è disponibile e potrebbe fornirti una soluzione rapida a seconda delle tue esigenze.

Una volta Apple aveva un'utilità molto rotta chiamata WS-MakeStubs. Non penso che sia disponibile su iPhone, ma potresti anche essere interessato a una libreria open source destinata a sostituirlo: il codice genera Objective-C per interagire con un client SOAP. Ancora una volta, non l'ho usato, ma l'ho annotato nelle mie note: wsdl2objc


Grazie, ho provato ad usare wsdl2objc. La generazione del codice ObjectiveC dal WSDL funziona, ma è (come previsto) non compilato direttamente con l'SDK di iPhone. Ho provato a modificare un po 'le fonti, ma ho finito con un mucchio di errori che non sono riuscito a risolvere
Gero,

2

È possibile connettersi utilizzando uno strumento che ho trovato 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

Ecco un rapido codice di esempio 4 che esegue la chiamata API utilizzando il formato del servizio 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()
    }

0

Dai un'occhiata a questo link e alla loro tabella di marcia. Hanno RO | C in arrivo e possono connettersi ai loro servizi web, che probabilmente include SOAP (io uso la versione VCL che lo include sicuramente).


0

Dai un'occhiata a gsoap che include due esempi iOS nel pacchetto di download in ios_plugin. Lo strumento converte WSDL in codice per SOAP e XML REST.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.