Cómo acceder a los servicios SOAP desde iPhone


224

Estoy planeando desarrollar una aplicación para iPhone y esa aplicación tendría que acceder a un par de servicios SOAP. Mientras realizaba algunas comprobaciones básicas en el iPhone SDK, no pude encontrar ningún soporte para acceder a los servicios SOAP, un poco de Google condujo a la conclusión de que no hay soporte para SOAP en el iPhone SDK.

Entonces, si quiero compilar esa aplicación, necesitaré un enfoque para acceder a los servicios SOAP desde el iPhone. ¿Cuál sería el mejor enfoque? ¿Alguna mejor práctica? ¿Alguien ya escribió una biblioteca usando la funcionalidad que está presente en el SDK de iPhone para acceder a los servicios SOAP?

(Dado que el servicio al que necesito acceder está expuesto por otra parte y solo lo exponen como SOAP, desafortunadamente no es una opción cambiar a otro tipo de interfaz (por ejemplo, API basada en REST).

Gero


99
Hola Gero, ¿Qué servicio de jabón usaste para tu aplicación? como no has mencionado ninguna respuesta correcta.
Ameya

3
Después de usar el servicio, publique los tutoriales para referencia futura para Otros.
Vineesh TP

Respuestas:


52

Una palabra: no lo hagas.

OK, obviamente, esa no es una respuesta real. Pero aún así, se debe evitar SOAP a toda costa. ;-) ¿Es posible agregar un servidor proxy entre el iPhone y el servicio web? ¿Quizás algo que convierte REST en SOAP para ti?

Usted podría tratar CSOAP , una biblioteca SOAP que depende de libxml2 (que está incluido en el iPhone SDK).

He escrito mi propio marco SOAP para OSX. Sin embargo, no se mantiene de forma activa y requerirá algo de tiempo para transferir al iPhone ( para comenzar, deberá reemplazar NSXML con TouchXML )


11
¿Puedes dar más detalles sobre esta afirmación "Pero aún así, el jabón debe evitarse a toda costa"
WillF

99
Solo porque el jabón no sea necesariamente apropiado no significa que no sea correcto en su implementación, hay necesidades que van más allá de las mejores prácticas la mayoría de las veces
Anthony Main

11
@schwa: rechazado por publicar una respuesta potencialmente útil sin absolutamente ninguna evidencia de respaldo o defensa.
DougW

12
Este es el equivalente técnico de "No lo use porque no se proporciona de manera predeterminada": no existe una razón técnica real por la que no deba usar SOAP ni ningún otro mecanismo proporcionado por un servicio.
Petesh el

99
Aquí hay al menos una respuesta: SOAP es un protocolo de sobrecarga muy alta en comparación con REST. Todos los espacios de nombres y la verificación de validez agregan una tonelada de caracteres adicionales a su mensaje, y esto es exactamente lo que desea evitar en una red de alta latencia y potencialmente lenta, como 3G. Si puede garantizar que su aplicación solo se utilizará en un entorno 4g con una señal excelente, o solo en Wifi, podría ser más adecuada. Pero, en general, con las redes móviles, menos es más.
Vineel Shah

7

Mi solución fue hacer que un servidor proxy aceptara REST, emitiera la solicitud SOAP y devolviera el resultado, usando PHP.

Tiempo de implementación: 15-30 minutos.

No muy elegante, pero sólido.


44
¿Como hiciste eso? cualquier documento tnx
Primavera

3
Me encanta la misteriosa falta de respuesta. ¿Cómo se votó esto?
gdbj

@gdbj porque una conversión 1: 1 entre REST y SOAP debería explicarse por sí misma ...
Magic Octopus Urn

1
Ese es el Qué, pero no responde la pregunta de Cómo, por eso la gente viene aquí. Todavía tengo curiosidad sobre la respuesta sobre cuál sería la implementación aquí, particularmente si es tan simple.
gdbj

4

Históricamente, he rodado mi propio acceso a un nivel bajo (generación y análisis XML) para hacer frente a la necesidad ocasional de hacer solicitudes de estilo SOAP de Objective-C. Dicho esto, hay una biblioteca disponible llamada SOAPClient ( soapclient ) que es de código abierto (con licencia BSD) y disponible en Google Code ( mac-soapclient ) que podría ser de interés.

No daré fe de sus habilidades o efectividad, ya que nunca lo he usado o he tenido que trabajar con sus API, pero está disponible y podría proporcionarle una solución rápida dependiendo de sus necesidades.

Apple tuvo, en un momento, una utilidad muy rota llamada WS-MakeStubs. No creo que esté disponible en el iPhone, pero también puede interesarle una biblioteca de código abierto destinada a reemplazar eso: el código genera Objective-C para interactuar con un cliente SOAP. Nuevamente, no lo he usado, pero lo he marcado en mis notas: wsdl2objc


Gracias, intenté usar wsdl2objc. La generación de código ObjectiveC a partir del WSDL funciona, pero (como se esperaba) no se compila directamente con el SDK de iPhone. Traté de modificar un poco las fuentes, pero terminé con un montón de errores que no pude resolver
Gero

2

Puedes conectarte usando una herramienta que encontré 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

Aquí hay un código de muestra rápido 4 que ejecuta llamadas API utilizando el formato de servicio 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

Eche un vistazo aquí a este enlace y su hoja de ruta. Tienen RO | C en camino, y eso puede conectarse a sus servicios web, lo que probablemente incluye SOAP (yo uso la versión VCL que definitivamente lo incluye).


0

Eche un vistazo a gsoap que incluye dos ejemplos de iOS en el paquete de descarga en ios_plugin. La herramienta convierte WSDL en código para SOAP y REST XML.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.