Desarrollando un API en REST 10/2009 http://twitter.com/alexpuig #phpbcn2009
1) Introducción Teórica 2) Terminología REST 3) Estructura 4) Recursos Desarrollando  un API en REST Desarrollando una API...
API - interfaz de programación de aplicaciones  La Transferencia de Estado Representacional (Representational State Transf...
API - interfaz de programación de aplicaciones  La Transferencia de Estado Representacional (Representational State Transf...
<ul><li>Una API representa una  interfaz de comunicación entre componentes de software . Se trata del conjunto de llamadas...
Qué no es REST <ul><ul><li>Un framework (aunque hay frameworks para desarrollo de APIs)
Una tecnología concreta
Una especificación </li></ul></ul>REST   <ul><ul><li>Técnica de arquitectura (es un conjunto de principios)
Actualmente se utiliza para definir una Interfaz web simple </li></ul></ul>(no basada en patrones de intercambio de mensaj...
Permite la portabilidad entre plataformas y lenguajes </li></ul></ul>Introducción Teórica Desarrollando una API en REST PH...
Introducción Teórica Desarrollando una API en REST PHP Barcelona 09
La arquitectura se simplifica (rendimiento) Peticiones se simplifican (velocidad) Curva de aprendizaje inexistente Resulta...
Introducción Teórica  Ventajas de REST De accesos a Bases de datos complejas select         projects.name as projname,    ...
Introducción Teórica  Ejemplo PHP con CURL $user = 'YOUREMAILADDRESS';            $password = 'YOURPASSWORD';             ...
La información es transferida de forma no optimizada según la aplicación Hacen falta múltiples llamadas para conseguir inf...
RPC :  Llamada a procedimiento remoto, es un protocolo que permite a un programa ejecutar código residente en otra máquina...
SOAP  : Define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML <s:Envelop...
REST es Mucho más sencillo REST es el equivalente a DBMS RPC/SOAP vendrían a ser los Stored procedures REST trata con recu...
<ul><li>Recursos
Identificadores de recursos
Representaciones
Operadores
Códigos de respuesta </li></ul>Terminología REST Desarrollando una API en REST PHP Barcelona 09
Toda información a la que  se pueda dar un nombre es  un recurso Los recursos son elementos  de información Terminología :...
<ul><li>Todo recurso tiene un nombre único que los identifica   URI (Uniform Resource Identifiers)
Los identificadores no cambian (o no deberían)
REST no especifica las URIs a utilizar </li></ul>Terminología :  Identificadores de recursos http://twitter.com/statuses/s...
- Para manipular estos recursos, los  componentes  de la red (clientes y servidores) se comunican a través de un interfaz ...
XML, PHP, JSON and JSONP. Esper... ¿JsonP? Json con Padding para solucionar un problema : AJAX crossDomain ({ &quot;propie...
GET Pedir información sobre un recurso POST Create : Comando al servidor para crear subordinados del recurso Update : Modi...
<ul><li>200 OK Standard response for successful HTTP requests
201 Created
202 Accepted
301 Moved Permanently
400 Bad Request
401 Unauthorised
402 Payment Required
Upcoming SlideShare
Loading in...5
×

Desarrollando un API con REST

27,815

Published on

Recomendaciones y buenos usos al desarrollar un servidor de servicios web en REST

Published in: Technology
1 Comment
28 Likes
Statistics
Notes
No Downloads
Views
Total Views
27,815
On Slideshare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
640
Comments
1
Likes
28
Embeds 0
No embeds

No notes for slide

Desarrollando un API con REST

  1. 1. Desarrollando un API en REST 10/2009 http://twitter.com/alexpuig #phpbcn2009
  2. 2. 1) Introducción Teórica 2) Terminología REST 3) Estructura 4) Recursos Desarrollando un API en REST Desarrollando una API en REST PHP Barcelona 09
  3. 3. API - interfaz de programación de aplicaciones La Transferencia de Estado Representacional (Representational State Transfer) o REST es una técnica de arquitectura software para sistemas hipermedia distribuidos como la World Wide Web Introducción Teórica Desarrollando una API en REST PHP Barcelona 09
  4. 4. API - interfaz de programación de aplicaciones La Transferencia de Estado Representacional (Representational State Transfer) o REST es una técnica de arquitectura software para sistemas hipermedia distribuidos como la World Wide Web Introducción Teórica Desarrollando una API en REST PHP Barcelona 09 WTF?
  5. 5. <ul><li>Una API representa una interfaz de comunicación entre componentes de software . Se trata del conjunto de llamadas a ciertas bibliotecas que ofrecen acceso a determinados servicios </li></ul><ul><li>Rest implica que una URL es la representación de un objeto o recurso, cuyos contenidos se acceden mediante HTTP </li></ul>Introducción Teórica Desarrollando una API en REST PHP Barcelona 09
  6. 6. Qué no es REST <ul><ul><li>Un framework (aunque hay frameworks para desarrollo de APIs)
  7. 7. Una tecnología concreta
  8. 8. Una especificación </li></ul></ul>REST <ul><ul><li>Técnica de arquitectura (es un conjunto de principios)
  9. 9. Actualmente se utiliza para definir una Interfaz web simple </li></ul></ul>(no basada en patrones de intercambio de mensajes) <ul><ul><li>Punto de acceso independiente de BBDD
  10. 10. Permite la portabilidad entre plataformas y lenguajes </li></ul></ul>Introducción Teórica Desarrollando una API en REST PHP Barcelona 09
  11. 11. Introducción Teórica Desarrollando una API en REST PHP Barcelona 09
  12. 12. La arquitectura se simplifica (rendimiento) Peticiones se simplifican (velocidad) Curva de aprendizaje inexistente Resultados visualmente interpretables Fácil escalabilidad y evolución de sus componentes Las funcionalidades pueden ser extendidas mediante widgets o scripts Simplicidad Introducción Teórica Ventajas de REST Desarrollando una API en REST PHP Barcelona 09
  13. 13. Introducción Teórica Ventajas de REST De accesos a Bases de datos complejas select         projects.name as projname,         cufiles.name as cuname,         basefiles.name as basename,         definefiles.name as defname from         definers inner join projects on definers.pid = projects.pid         inner join files as cufiles on definers.cuid=cufiles.fid         inner join  files as basefiles on definers.basefileid=basefiles.fid         inner join files as definefiles on definers.definerid = definefiles.fid; WHERE projects.pid=51 A peticiones Simples : http://api.example.com/project-51 PHP Conference 2009 Desarrollando una API en REST - Introducción teórica
  14. 14. Introducción Teórica Ejemplo PHP con CURL $user = 'YOUREMAILADDRESS';           $password = 'YOURPASSWORD';               $ch = curl_init(&quot;https://twitter.com/statuses/user_timeline.xml&quot;);            curl_setopt($ch, CURLOPT_HEADER, 1);            curl_setopt($ch,CURLOPT_TIMEOUT, 30);            curl_setopt($ch,CURLOPT_USERPWD,$user . &quot;:&quot; . $password);            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);            curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);            curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);            $result=curl_exec ($ch);            $data = strstr($result, '<?');               $xml = new SimpleXMLElement($data);               return $xml;   Desarrollando una API en REST PHP Barcelona 09
  15. 15. La información es transferida de forma no optimizada según la aplicación Hacen falta múltiples llamadas para conseguir información compleja XML JSON PHP … Introducción Teórica Desventajas de REST Desarrollando una API en REST PHP Barcelona 09
  16. 16. RPC : Llamada a procedimiento remoto, es un protocolo que permite a un programa ejecutar código residente en otra máquina Introducción Teórica Alternativas a REST : RPC <methodCall> <methodName> function </methodName> <params> <param> <value> <struct> <member> <name> name </name> <value><string> value </string></value> </member> </struct> </value> </param> </params> </methodCall> <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <methodResponse> <params> <param> <value><string>[result]</string></value> </param> </params> </methodResponse> Llamada Respuesta Desarrollando una API en REST PHP Barcelona 09
  17. 17. SOAP : Define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML <s:Envelope xmlns:s= http://www.w3.org/2003/05/soap-envelope xmlns:xsi=&quot;http://www.w3.org/1999/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/1999/XMLSchema&quot; > <s:Body> <x:ApiRequest xmlns:x=&quot;urn:flickr&quot;> <method>api.test.echo</method> < name > value </ name > </x:ApiRequest> </s:Body> </s:Envelope> Llamada Introducción Teórica Alternativas a REST : SOAP Desarrollando una API en REST PHP Barcelona 09
  18. 18. REST es Mucho más sencillo REST es el equivalente a DBMS RPC/SOAP vendrían a ser los Stored procedures REST trata con recursos, SOA (Service Oriented Architecture) con acciones y servicios (trasladar complejidad al cliente o al servidor) (1) No IDLs (Interface Description Language) o WSDLs (Web Services Description Language) o WADL (Web Application Description Language) No son incompatibles, se pueden ofrecer las dos opciones Introducción Teórica ROA vs SOA (1) Pero se puede hacer Desarrollando una API en REST PHP Barcelona 09
  19. 19. <ul><li>Recursos
  20. 20. Identificadores de recursos
  21. 21. Representaciones
  22. 22. Operadores
  23. 23. Códigos de respuesta </li></ul>Terminología REST Desarrollando una API en REST PHP Barcelona 09
  24. 24. Toda información a la que se pueda dar un nombre es un recurso Los recursos son elementos de información Terminología : Recursos Desarrollando una API en REST PHP Barcelona 09
  25. 25. <ul><li>Todo recurso tiene un nombre único que los identifica  URI (Uniform Resource Identifiers)
  26. 26. Los identificadores no cambian (o no deberían)
  27. 27. REST no especifica las URIs a utilizar </li></ul>Terminología : Identificadores de recursos http://twitter.com/statuses/show/ id . format http://vimeo.com/api/v2/username/request.output Desarrollando una API en REST PHP Barcelona 09
  28. 28. - Para manipular estos recursos, los componentes de la red (clientes y servidores) se comunican a través de un interfaz estándar (HTTP) e intercambian representaciones de estos recursos (los ficheros que se descargan y se envían) - Un recurso particular puede tener múltiples representaciones - Representaciones más comunes : html, xml, json… - Idealmente la representación debería ser negociada en los datos de control de la cabecera HTTP Terminología : Representaciones Desarrollando una API en REST PHP Barcelona 09
  29. 29. XML, PHP, JSON and JSONP. Esper... ¿JsonP? Json con Padding para solucionar un problema : AJAX crossDomain ({ &quot;propiedad1&quot; : &quot;valor1&quot;, &quot;propiedad2&quot; : &quot;valor2&quot; }) FuncionPuente ({ &quot;propiedad1&quot; : &quot;valor1&quot;, &quot;propiedad2&quot; : &quot;valor2&quot; }) JSON JSONP Terminología : Representaciones window.document.write(' <script src=&quot; http://api.yoursite.com/res1.jsonp?callback=funcionCallback &quot;><!--mce:0--></script> &quot;); var funcionCallback = function( json ) { alert(json.propiedad1); alert(json.propiedad2); } Desarrollando una API en REST PHP Barcelona 09
  30. 30. GET Pedir información sobre un recurso POST Create : Comando al servidor para crear subordinados del recurso Update : Modificar subordinados del recurso PUT Create : Crear un nuevo recurso Update : Modificar el recurso DELETE Eliminar un recurso Terminología : Operadores GET/POST/PUT/DELETE != CRUD Desarrollando una API en REST PHP Barcelona 09
  31. 31. <ul><li>200 OK Standard response for successful HTTP requests
  32. 32. 201 Created
  33. 33. 202 Accepted
  34. 34. 301 Moved Permanently
  35. 35. 400 Bad Request
  36. 36. 401 Unauthorised
  37. 37. 402 Payment Required
  38. 38. 403 Forbidden
  39. 39. 404 Not Found
  40. 40. 405 Method Not Allowed
  41. 41. 500 Internal Server Error
  42. 42. 501 Not Implemented </li></ul>Terminología : Operadores (HTTP Response Codes) Desarrollando una API en REST PHP Barcelona 09
  43. 43. Sí, Bueno, vale, de acuerdo…. Pero cómo lo desarrollo? Estructura Desarrollando una API en REST PHP Barcelona 09
  44. 44. Recomendación de estructura <ul><li>definir URIs.¿puntos de entrada?
  45. 45. TDD : Test Driven Development
  46. 46. Seguir un Patrón MVC
  47. 47. Implementar sistema de Caché </li></ul>Proyecto <ul><li>Primera capa : seguridad + parseo URIs
  48. 48. Controlador principal para generar el formato deseado
  49. 49. Controladores que agrupen funcionalidades comunes
  50. 50. Modelos para acceso a los datos </li></ul>Estructura Desarrollando una API en REST PHP Barcelona 09
  51. 51. Estructura URIs Define bien tus URIs: son los puntos de entrada a tu API <ul><li>Simplifica la URI para simplificar el parseo </li></ul><ul><li>Evita Parámetros </li></ul><ul><li>Al ser un identificador único te servirá para la caché </li></ul><ul><li>Que te permita organizar tus controladores eficazmente </li></ul>Desarrollando una API en REST PHP Barcelona 09
  52. 52. Estructura URIs OK api.yoursite.com/recurso1-info/21.xml api.yoursite.com/recurso1/21.php api.yoursite.com/recurso1-info/21/pag/2.json Define bien tus URIs: son los puntos de entrada a tu API <ul><li>Simplifica la URI para simplificar el parseo </li></ul><ul><li>Evita Parámetros </li></ul><ul><li>Al ser un identificador único te servirá para la caché </li></ul><ul><li>Que te permita organizar tus controladores eficazmente </li></ul>Desarrollando una API en REST PHP Barcelona 09
  53. 53. Estructura URIs KO api.yoursite.com/recurso1?info=31 api.yoursite.com/recurso1info31pag12?type=xml api.yoursite.com/dameaccesoal31enlapágina2pls Define bien tus URIs: son los puntos de entrada a tu API <ul><li>Simplifica la URI para simplificar el parseo </li></ul><ul><li>Evita Parámetros </li></ul><ul><li>Al ser un identificador único te servirá para la caché </li></ul><ul><li>Que te permita organizar tus controladores eficazmente </li></ul>Desarrollando una API en REST PHP Barcelona 09
  54. 54. Desarrollo orientado al test <ul><li>Desarrollar primero un juego de pruebas para los componentes de la aplicación (arquitectura de la aplicación) </li></ul><ul><li>Desarrollar un juego de pruebas para las funcionalidades del API (cada una de los recursos que ofrecerás) </li></ul><ul><li>Integrar un sistema de control que obligue a pasar todas las pruebas antes de subir los cambios en el API (con TortoiseSVN o Hooks de servidor) </li></ul><ul><li>Utilizar PHPUnit http://www.phpunit.de/ </li></ul>Estructura TDD Desarrollando una API en REST PHP Barcelona 09
  55. 55. Estructura MVC Diagrama de flujo Dispatcher Parsear URI Válida En caché Error Controlador Modelo Vista Guarda en caché Mostrar Sí Sí No No Vista Desarrollando una API en REST PHP Barcelona 09
  56. 56. Estructura MVC Esquema aplicación A index.php parser.php error.php controller.class.php libros.php autores.php model.class.php autores.php libros.php Unit Testing config.php Seguridad Autentificación + Vista Controladores Modelos Desarrollando una API en REST PHP Barcelona 09
  57. 57. Estructura MVC Esquema aplicación B error.php controller.class.php libros.php autores.php model.class.php autores.php libros.php Unit Testing Autentificación + Vista + seguridad Controladores Modelos Desarrollando una API en REST PHP Barcelona 09
  58. 58. Estructura Caché Tu URI puede servir como identificador para la caché Memcached : http://www.danga.com/memcached/ $cache_id = $info[‘URI']; $memcached = new Memcache; $memcached->connect('hostname', 11211); if ( ($row = $memcached->get( $cache_id)) === false ) { // Get resource frrom DB into $row. $memcached->set( $cache_id, $row, MEMCACHE_COMPRESSED, time() + 3600); } echo $row; Desarrollando una API en REST PHP Barcelona 09
  59. 59. if (!($_SERVER['PHP_AUTH_USER'] == $config['username'] && $_SERVER['PHP_AUTH_PW'] == $config['password'])) { header(&quot;WWW-Authenticate: Basic realm=“Your API&quot;&quot;); header(&quot;HTTP/1.0 401 Unauthorized&quot;); exit; } Limitar el acceso a tu API <ul><li>Sistema de llaves </li></ul><ul><li>Autentificación con HTTP vía PHP </li></ul>Recursos Autentificación <ul><li>Gestión de API keys
  60. 60. Estadísticas de uso
  61. 61. Monetizar tu API
  62. 62. http://www.3scale.com </li></ul>Desarrollando una API en REST PHP Barcelona 09
  63. 63. JSONView 0.3 Permite abrir documentos JSON en el navegador. https://addons.mozilla.org/es-ES/firefox/addon/10869 Recursos Test Tools Desarrollando una API en REST PHP Barcelona 09
  64. 64. RESTClient 1.2.8 Permite visualizar y testear servicios RESTful/WebDav. https://addons.mozilla.org/es-ES/firefox/addon/9780 Recursos Test Tools Desarrollando una API en REST PHP Barcelona 09
  65. 65. Herramientas existentes http://www.recessframework.org/ http://tonic.sourceforge.net/ http://wso2.org/projects/wsf/ http://framework.zend.com Recursos Frameworks Desarrollando una API en REST PHP Barcelona 09
  66. 66. <ul><li>No te compliques la vida (otros lo harán por ti) </li></ul><ul><li>Olvida la semántica y los acrónimos complicados. Construye el servicio web que más te interese </li></ul><ul><li>Genera una buena documentación </li></ul><ul><li>Involucra a la comunidad : escucha y delega, deja que sea la comunidad quien decida el rumbo del API </li></ul><ul><li>Piensa en escalabilidad : límites del servicio, servidores, particiones… </li></ul><ul><li>¿NoSQL (couchDB) como alternativa a REST? </li></ul>Divagando voy… Desarrollando una API en REST PHP Barcelona 09
  67. 67. [email_address] Labs Developer en Softonic Twitter : @alexpuig Blog : http://www.alexpuig.es Muchas Gracias! Desarrollando una API en REST PHP Barcelona 09
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×