2011-12-22 31 views
8

Esta es una pregunta muy común que se repite una y otra vez sobre el desbordamiento de pila y leo tantas respuestas sobre esto, pero todavía estoy un poco confundido.¿Cómo funcionan SOAP y REST con la respuesta XML/JSON?

Necesito llamar a los servicios web desde el iPhone SDK.

Aquí están mis preguntas:

  1. no me queda claro lo SOAP de respuesta o RESTO return.Is Hay algo específico que si la respuesta es XML entonces debemos utilizar REST y JSON si debemos utilizar jabón?

  2. ¿Cuál es el papel de ASIHTTP con SOAP y REST?

  3. si recibo respuesta XML como

<oproduct> 
    <iid>113133791</iid> 
    <icategoryid>270</icategoryid> 
    <imerchantid>1547</imerchantid> 
    <iadult>0</iadult> 
    <sname>The Ashes/1st Test - England v Australia - Day 1</sname> 
    <sawdeeplink>http://www.acbcd.com/pclick.php?p=113133791&amp;a=111402&amp;m=1547&amp;platform=cs</sawdeeplink> 
    <sawthumburl>http://images.abcdd.com/thumb/1547/113133791.jpg</sawthumburl> 
    <fprice>69.99</fprice> 
    </oproduct> 

¿Es necesario analizar a mano? o ¿cómo manejo la respuesta XML?

Tengo tantos artículos sobre REST y SOAP pero no el código adecuado para entenderlo. Le agradecería cualquier ayuda con respecto a estas preguntas.

Respuesta

71

de SOAP - "Simple Object Access Protocol"

SOAP es un método de transferencia de mensajes, o pequeñas cantidades de información, a través de Internet. Los mensajes SOAP se formatean en XML y generalmente se envían usando HTTP (protocolo de transferencia de hipertexto).

Así que SOAP tiene un estándar de cómo un mensaje tiene que ser enviado.

Cada servicio web soap se puede definir con un WSDL (Web Service Definition Language) que es como un esquema para el SOAP XML transferido.

Hay muchas herramientas disponibles para convertir WSDL (su definición de servicio web) a código nativo.

Una de las herramientas disponibles para ObjC es Sudz-C (http://sudzc.com/) que convierten la WDSL de cualquier servicio web con el código ObjC para acceder al servicio Web.


Resto - transferencia de estado representacional

resto es una forma sencilla de enviar y recibir datos entre el cliente y el servidor y que no tienen ningún estándar definido tanto, puede enviar y recibir datos, JSON, XML o incluso un texto. Su Luz ponderada en comparación con SOAP.

Para manejar Rest en iOS hay muchas herramientas disponibles, recomendaría RestKit http://restkit.org/, para manejar XML y JSON ambos.

Yo te sugeriría ir con descanso para el desarrollo móvil, ya que su peso ligero SOAP vs REST

(ejemplo simple, la gente me corrija si estoy equivocado)

+5

Esto es increíble. –

+0

@ jshin47 gracias – Nakkeeran

+10

+1 por imagen divertida;) –

1

1) Las respuestas SOAP deben ser XML, y para devolver otros formatos es necesario incrustarlos en el XML de respuesta (ineficaz) o usar archivos adjuntos SOAP (difícil). Las respuestas SOAP están contenidas en una etiqueta de sobre de jabón, y generalmente hay una wsdl asociada. Si el XML que muestra es todo lo que obtiene, entonces puede que no sea un servicio SOAP. Veo enlaces en el XML, por lo que es una buena señal de que tenían REST en mente.

2) No he oído hablar de ASIHTTP. Un Google rápido, y parece que es una biblioteca de terceros que envuelve las interfaces http en iOS. Parece que usaría eso para ayudarlo a hacer las solicitudes http, aunque sugeriría que podría no ser necesario; debe evaluar el uso de las bibliotecas http directamente.

3) Debe analizarlo de alguna manera. Puedes hacerlo a mano, pero en general es una muy mala idea. XML puede venir en muchas formas y seguir teniendo el mismo significado, y si no admite todos los formularios, su aplicación podría romperse en el futuro si el proveedor de servicios web comenzara a formatear su XML de manera diferente, incluso si su semántica fuera la misma. Utilizaría una API XML para leer el XML. La API DOM lo leerá en forma de árbol, y puede usar XPath para extraer información del árbol.

+0

¿Cuál es la otra opción para leer XML no por ¿mano? ¿es TouchXML en lugar de NSXML?porque tengo la práctica de usar NSXML y analizarlo a mano con '(void) analizador: (NSXMLParser *) analizador didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atributos: (NSDictionary *) atributeDict { si ([elementName isEqualToString: @ "NoOfObjectsDetected"]) { noOfObjetcsArray = [alloc NSMutableArray] initwithcapacity: 0]; elementNameStr = elementName; } } 'method – Heena

+0

No estoy familiarizado con NSXML, pero parece que crea estructuras de árbol para usted fuera del xml, así que no lo llamaría" analizar a mano ". Si estás familiarizado con él, entonces hazlo. – Bill

+0

Lo que entiendo "analizar a mano" es que ya conozco la estructura del árbol como en cuestión, y estoy analizando cada etiqueta una por una usando los métodos anteriores en mi comentario anterior – Heena

5

Ok, por lo que tiene algunas preguntas diferentes aquí:

  1. REST es una forma de acceder a el servicio web. SOAP es una forma alternativa de acceder al servicio web. REST utiliza la cadena de consulta o el formato de URL, mientras que SOAP usa XML. JSON y XML son dos formas diferentes de devolver datos. SOAP y XML generalmente están asociados entre sí. Para aplicaciones móviles, REST/JSON suele ser el camino a seguir. Más fácil de implementar y mantener, mucho más telegráfico, etc.

  2. ASIHTTP, como señala Bill, es un contenedor. Hay otras opciones que hacen cosas similares dependiendo de lo que necesita. Si está utilizando REST/JSON entonces NSURLConnection + SBJSON podría hacer el truco, me gusta personalmente.

  3. Si su servicio SOAP tiene un WSDL disponible, puede usar wsdl2objc para compilar automáticamente el código para su análisis y recuperación. Si se trata de un servicio JSON o sin WSDL está disponible, yo recomendaría usar SBJSON y simplemente analizar de la siguiente manera:

    de (id jsonElement en repsonse) { self.propertyA = [jsonElement valueForKey: @ "KEYA" ]; self.propertyB = [jsonElement valueForKey: @ "keyB"]; }

Espero que ayude!

Cuestiones relacionadas