Cómo acceder a los servicios SOAP desde iPhone

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

Entonces, si quiero construir esa aplicación, tendré que idear 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 utilizando la funcionalidad que está presente en el iPhone SDK para acceder a los servicios SOAP?

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

Gero

Una palabra: no.

OK, obviamente esa no es una respuesta real. Pero todavía debe evitarse SOAP a toda costa. 😉 ¿Es posible agregar un servidor proxy entre el iPhone y el servicio web? Tal vez algo que convierte REST en SOAP para usted?

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

Escribí mi propio marco SOAP para OSX. Sin embargo, no se mantiene activamente y requerirá algún tiempo para conectarse al iPhone (para empezar, deberá reemplazar NSXML con TouchXML ).

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

Tiempo para implementar: 15-30 minutos.

No es muy elegante, sino sólido.

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

No daré fe de sus capacidades o eficacia, 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 según sus necesidades.

Apple tenía, en un momento, una utilidad muy corta llamada WS-MakeStubs. No creo que esté disponible en el iPhone, pero también podría estar interesado en una biblioteca de código abierto destinada a reemplazarla: generar código Objective-C para interactuar con un cliente SOAP. De nuevo, no lo he usado, pero lo he marcado en mis notas: wsdl2objc

Puede conectarse utilizando 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]; 

Echa un vistazo a este enlace y su hoja de ruta. Tienen RO | C en camino y pueden conectarse a sus servicios web, que probablemente incluyen SOAP (utilizo la versión VCL que definitivamente la incluye).

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

Aquí hay un rápido código de muestra 4 que ejecuta llamadas API usando el formato de servicio SOAP.

  func callSOAPWSToGetData() { let strSOAPMessage = "" + "" + "" + "" + "50" + "" + "" + "" 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() }