© DCM-DCIC-UNS 1 © DCM-DCIC-UNS 1 Depto de Cs e Ing. de la Computación Universidad Nacional del Sur XML-RPC - elementos XML-RPC requiere que los datos pasados entre las partes estén en un elemento XML denominado value <value> </value> El contenido identifica el tipo de dato <value><int>5</int></value> <value><i4>5</i4></value> <value><double>2.34334</double></value> <value><boolean>0</boolean></value> <value><string>Hola!</string></value> <value><dateTime.iso8601> 20110503T09:15:00 </dateTime.iso8601></value> <value><base64>Hola!</base64></value> 10 © Diego C. Martínez - DCIC-UNS XML-RPC - elementos Estructuras más complejas (como arreglos asociativos) se representan en XML-RPC con el tipo de dato structure, una colección de valores nombrados. <value> <struct> <member> <name>..</name> <value>..</value> </member> ... </struct> </value> $a = array( ”nombre”=>”Juan”, ”deuda”=>”23.5” ); © Diego C. Martínez - DCIC-UNS © DCM-DCIC-UNS Puede haber varios elementos de tipo member <value> <struct> <member> <name>nombre</name> <value> <string>Juan</string> </value> </member> <member> <name>deuda</name> <value> <double>23.5</double> </value> </member> </struct> </value> 12 1 Ingeniería de Aplicaciones Web Dr. Diego C. Martínez Depto de Cs e Ing. de la Computación Universidad Nacional del Sur XML-RPC Requests XML-RPC Requests Los requerimientos y respuestas también tienen un formato XML predefinido. getPeliculas( año estreno , nombre del actor , incluir descripcion ); getPeliculas(80,”Robert De Niro”,true); Estructura del XML-RPC Request: <?xml version="1.0" encoding="UTF-8"?> <methodCall> <methodName>nombre del método</methodName> <params> <param> parametro1 Puede no haber </param> <param> parámetros y se omite el parametro2 elemento params </param> <?xml version="1.0" encoding="UTF-8"?> <methodCall> <methodName>getPeliculas</methodName> <params> <param> <value><int>80</int></value> </param> <param> <value><string>Robert de Niro</string></value> </param> <param> <value><boolean>1</boolean></value> </param> </params> </methodCall> ... </params> </methodCall> El orden de los parámetros es importante. El tipo de los parámetros es importante si lo es para el receptor. PHP es loosely typed © Diego C. Martínez - DCIC-UNS 13 XML-RPC Response © Diego C. Martínez - DCIC-UNS 14 XML-RPC Response El formato de una respuesta XML-RPC también es fijo y predefinido Estructura del mensaje de error XML-RPC Estructura del XML-RPC response: <?xml version="1.0"?> <methodResponse> <fault> <value> <struct> <member> <name>faultCode</name> <value><int>55</int></value> </member> <member> <name>faultString</name> <value><string>Mensaje Error</string></value> </member> </struct> </value> </fault> </methodResponse> <?xml version="1.0"?> <methodResponse> <params> <param> <value> valor del resultado </value> </param> </params> </methodResponse> <?xml version="1.0"?> <methodResponse> <params/> </methodResponse> © Diego C. Martínez - DCIC-UNS © DCM-DCIC-UNS 15 © Diego C. Martínez - DCIC-UNS 16 1 Ingeniería de Aplicaciones Web Dr. Diego C. Martínez Depto de Cs e Ing. de la Computación Universidad Nacional del Sur XML-RPC en PHP XML-RPC en PHP PHP ofrece librerías para utilizar XML-RPC con relativa facilidad. Algunos objetos de la extensión PEAR: Algunos métodos de la extensión xmlrpc: $val = new XML_RPC_Value(datos) Crea un objeto que contiene valores XML_RPC xmlrpc_encode($array) Codifica un arreglo de parámetros en el elemento params. $val = new XML_RPC_Message($string, $array) Crea un objeto mensaje. Recibe el nombre del método y los parámetros (un arreglo de objetos XML_RPC_Value) xmlrpc_decode($xml) Decodifica un elemento params en datos de tipos nativos de PHP $val = new XML_RPC_Client(path, server , port , proxy ...) Crea un objeto cliente de un servicio XML-RPC. Es configurado con el servidor remoto y se encarga de toda la comunicación :) Posee un método send para enviar un XML_RPC_Message xmlrpc_encode_request($metodo,$array) Genera un request en XML. Se indica el método remoto y los parámetros xmlrpc_decode_request($xml,$metodo) Decodifica un mensaje de respuesta XML-RPC en datos de tipos nativos de PHP y devuelve en $metodo el nombre del método invocado. XML_RPC_Response Los objetos que devuelve la operación send de XML_RPC_Client son de tipo XML_RPC_Response. xmlrpc_is_fault($datos) Devuelve verdadero si la respuesta decodificada es un error del servidor © Diego C. Martínez - DCIC-UNS 17 REST 18 © Diego C. Martínez - DCIC-UNS REST REST significa Representational State Transfer. No es un estándar como los anteriores, sino una abstracción de elementos de una arquitectura dentro de un sistema hipermedial distribuido. REST ve el mundo como una colección de recursos. Los recursos se identifican por medio de URI o URL: http://cs.uns.edu.ar/materias/rpa Básicamente, traslada la configuración de un request, a las tecnologías ya provistas por la web. En este caso, la URL retorna la representación de la materia rpa. Esta representación posee vínculos a otras representaciones (links) El uso de REST implica el uso de las siguientes tecnologías: Una implementación REST concreta ● usa los métodos HTTP explícitamente El principio básico de REST vincula los métodos HTTP con CRUD. ● carece de estado (stateless) Toda la información necesaria para la respuesta está incluida en los mensajes. ● expone URL con formato de estructura de directorios Debe ser intuitivo y fácil de adivinar. ● transfiere XML (o JSON) Un estándar de estructurado de datos simple y fácil de procesar XML El formato elegido para la transferencia de los recursos solicitados HTTP El protocolo ofrece métodos que se utilizan para definir las acciones a realizar: GET, HEAD, POST, PUT y DELETE. URI El identificador del recurso que representa el servicio wev MIME type El tipo MIME será text/xml © Diego C. Martínez - DCIC-UNS © DCM-DCIC-UNS 19 © Diego C. Martínez - DCIC-UNS 20 1 Ingeniería de Aplicaciones Web Dr. Diego C. Martínez Depto de Cs e Ing. de la Computación Universidad Nacional del Sur REST – mensajes HTTP REST – URLs REST asigna un rol especial a los mensajes HTTP, consistente con su uso web. http://www.autopartes.com/partes GET Recupera la representación de un recurso Retrieve HEAD Recupera metadatos de la representación de un recurso Retrieve POST Estrictamente, crea un recurso. Se usa también para actualizar un recurso o borrarlo <?xml version="1.0"?> <p:partes xmlns:p="http://www...." xmlns:xlink="http://..."> <p:autoparte id="ABC1" xlink:href="http://www.autopartes.com/partes/ABC1"/> <p:autoparte id="DEF2" xlink:href="http://www.autopartes.com/partes/DEF2"/> <p:autoparte id="GEW3" xlink:href="http://www.autopartes.com/partes/GEW3"/> <p:autoparte id="KLM1" xlink:href="http://www.autopartes.com/partes/KLM1"/> </p:Parts> Create PUT Actualiza un recurso. Usualmente reemplazado por el método POST Update DELETE Elimina un recurso. Usualmente reemplazado por el método POST Delete http://www.autopartes.com/partes/DEF2 © Diego C. Martínez - DCIC-UNS <?xml version="1.0"?> <p:partes xmlns:p="http://www...." xmlns:xlink="http://..."> <p:autoparte> <p:id>DEF2</p:id> <p:desc>paragolpe delantero</p:desc> <p:auto>Fiat 600</p:auto> <p:stock>Fiat 600</p:stock> </p:autoparte> </p:Parts> 21 REST - URLs ● ● ● ● ● 22 JSON Algunas guías generales para la estructuración de las URLs ● Debería ofrecerse también el DTD o XSD de la respuesta © Diego C. Martínez - DCIC-UNS En general, el formato de transmisión de datos en servicios web es XML Pensar en la URL como una interfaz auto-documentada. Mantener una estructura jerárquica razonable y descriptiva Ocultar la tecnología de scripting del lado servidor (.jsp,.asp,.php, etc) Utilizar si es posible, URL-rewriting. Utilizar siempre letras minúsculas Es una convención general y evita confusiones. Sustituir espacios por guiones Hace legible el URL y evita encodings que serían obligatorios Evitar, en lo posible, los query strings. La excesiva parametrización ofusca el URL. Puede utilizarse también URL-rewriting Reemplazar el mensaje 404 por un recurso por default Es más general y conduce a un procesamiento uniforme del lado cliente Recientemente ha habido una tendencia a utilizar formatos más simples y más directos de procesar por JavaScript como tecnología del lado cliente JSON = JavaScript Object Notation JSON es un subconjunto de la notación object literal. La Notación Literal de Objetos permite describir en forma simple y directa una estructura de datos compleja, principalmente objetos. var empleado={ nombre:'Homero', apellido:'Simpson', nombrecompleto:function(){ return this.nombre+' '+this.apellido; } } © Diego C. Martínez - DCIC-UNS © DCM-DCIC-UNS 23 © Diego C. Martínez - DCIC-UNS 24 1 Ingeniería de Aplicaciones Web Dr. Diego C. Martínez Depto de Cs e Ing. de la Computación Universidad Nacional del Sur JSON La idea es representar la información con JSON, en lugar de XML: <albums> <album> <titulo> Master of Puppets </titulo> <artista> Metallica </artista> </album> <album> <titulo> The Division Bell </titulo> <artista> Pink Floyd </artista> </album> <albums> { 'album': [ { 'titulo' 'artist' }, { 'titulo' 'artist' ] : 'Master of Puppets', : 'Metallica', : 'The Division Bell', : 'Pink Floyd', } La principal ventaja es que al ser un formato de datos propio de JavaScript, es fácil interpretarlo. No hace falta parsing como en XML. © Diego C. Martínez - DCIC-UNS © DCM-DCIC-UNS 25 1