{"id":806,"date":"2021-06-01T19:49:38","date_gmt":"2021-06-02T00:19:38","guid":{"rendered":"http:\/\/gregorgonzalez.com.ve\/blog\/?p=806"},"modified":"2021-06-01T20:05:32","modified_gmt":"2021-06-02T00:35:32","slug":"mejores-practicas-para-el-diseno-de-interfaces-de-api-rest","status":"publish","type":"post","link":"http:\/\/gregorgonzalez.com.ve\/blog\/mejores-practicas-para-el-diseno-de-interfaces-de-api-rest\/","title":{"rendered":"Mejores pr\u00e1cticas para el dise\u00f1o de interfaces de API REST"},"content":{"rendered":"<p>Representational state transfer (REST) es un estilo de arquitectura de software que se usa para crear aplicaciones de servicios web. Un servicio web que sigue estas pautas se denomina RESTful. Dicho servicio debe proporcionar recursos web en un conjunto predefinido de operaciones con un protocolo sin estado.<br \/>\n&nbsp;<\/p>\n<h3>\nCondiciones que debe cumplir<\/h3>\n<p><strong>Cliente-servidor:<\/strong> aplicaci\u00f3n de cliente y aplicaci\u00f3n de servidor. Se trata de la separaci\u00f3n de responsabilidades, con ello mejoramos la portabilidad y la escalabilidad porque permite que esos componentes evolucionen de forma independiente.<\/p>\n<p><strong>Sin estado:<\/strong> cada solicitud de un cliente al servidor debe contener toda la informaci\u00f3n necesaria, incluidos los detalles de autenticaci\u00f3n, el servidor no puede almacenar nada sobre solicitudes, sesiones, historial, etc.<\/p>\n<p><strong>Cach\u00e9:<\/strong> cuando los datos de las posibles respuestas deben almacenarse en cach\u00e9, los clientes tienen derecho a reutilizar los datos de las respuestas m\u00e1s adelante. Esto mejorar\u00e1 la eficiencia y la escalabilidad, pero se debe tomar en cuenta que puede disminuir la confiabilidad si los datos almacenados en cach\u00e9 difieren significativamente de los datos en el servidor.<\/p>\n<p><strong>Interfaz uniforme:<\/strong> definir y mantener los est\u00e1ndares de la interfaz API, por ejemplo, identificaci\u00f3n de recursos y mensajes de respuesta. Si usas los nombres de recursos en plural, debes seguir este est\u00e1ndar en todos los URI, mejorar\u00e1 la legibilidad y la capacidad de mantenimiento.<\/p>\n<p><strong>Sistema en capas:<\/strong> el sistema debe estar compuesto por componentes en capas jer\u00e1rquicas, cada componente solo es consciente de la capa inmediata con la que est\u00e1n interactuando. Por ejemplo, un sistema puede tener una capa de datos, una capa de cach\u00e9, una capa de seguridad, etc. Y todas esas capas no deber\u00edan afectar la comunicaci\u00f3n entre el servidor y el cliente.<\/p>\n<p><strong>C\u00f3digo bajo demanda:<\/strong> esta es la \u00fanica condici\u00f3n opcional, el servidor proporcionar\u00e1 representaciones est\u00e1ticas de los recursos, pero cuando se le solicite, puede enviar c\u00f3digo ejecutable.<br \/>\n&nbsp;<\/p>\n<h3>\nMejores pr\u00e1cticas para dise\u00f1ar una interface de API uniforme<\/h3>\n<p>REST se aplica con frecuencia en aplicaciones web y aprovecha el protocolo HTTP, mas no se limita a ello. Una API RESTful expondr\u00e1 los recursos de la aplicaci\u00f3n a trav\u00e9s de un grupo de identificadores uniformes de recursos (URI). Las respuestas que devolver\u00e1 ser\u00e1n en JSON o XML, incluso ambos, dando la opci\u00f3n que el cliente elija el tipo de respuesta usando el encabezado de tipo de contenido. Una vez definidos los recursos de la aplicaci\u00f3n, es hora de elegir una estrategia de nomenclatura de recursos y combinarla con los m\u00e9todos HTTP para representar operaciones en esos recursos.<\/p>\n<p>Es importante definir est\u00e1ndares para las respuestas. En la fase de dise\u00f1o de la API debemos tener en cuenta las siguientes preguntas:<\/p>\n<ul>\n<li>\u00bfCu\u00e1l ser\u00e1 el organismo de respuesta en caso de falla?<\/li>\n<li>\u00bfTendr\u00e1 un mensaje que describa el error, solo un c\u00f3digo de referencia o ambos?<\/li>\n<li>En caso de \u00e9xito, \u00bfQu\u00e9 datos de recursos se presentar\u00e1n?<\/li>\n<li>\u00bfQu\u00e9 c\u00f3digos de respuesta HTTP se utilizar\u00e1n en cada respuesta?<\/li>\n<\/ul>\n<p>Vamos a ver varios ejemplos para aclarar esas dudas.<br \/>\n&nbsp;<\/p>\n<h3>\nUsar sustantivos para representar recursos, no acciones<\/h3>\n<p>Imaginemos que tenemos una API para consultar libros, con una url definida \u00abapi.mipagina.com\u00bb y tenemos una idea Err\u00f3nea de escribir la acci\u00f3n en la url \u00abhttps:\/\/api.mipagina.com\/obtener-libros\u00bb, debemos evitar ese modo de trabajo, la acci\u00f3n \u00abobtener\u00bb deber\u00eda definirse por el tipo de m\u00e9todo HTTP.<\/p>\n<p>https:\/\/api.mipagina.com\/libros<\/p>\n<p>Por defecto consultamos dicha url con un simple get para obtener informaci\u00f3n. Es un est\u00e1ndar para API Rest.<\/p>\n<p>Si decidimos usar el plural \u00ablibros\u00bb, debemos obligar a que todos los recursos de la aplicaci\u00f3n est\u00e9n en plural, para evitar confusiones y mantener el est\u00e1ndar.<br \/>\n&nbsp;<\/p>\n<h3>\nUsar la relaci\u00f3n jer\u00e1rquica entre recursos<\/h3>\n<p>Si necesitamos consultar detalles de los libros, como, por ejemplo, consultar por autor, podr\u00edamos generar las URI de esta manera:<\/p>\n<pre class=\"lang:xhtml decode:true\">\/\/ Todos los libros de un autor\r\nhttps:\/\/api.mipagina.com\/autores\/id\/libros\r\n\r\n\/\/ Un libro de un autor\r\nhttps:\/\/api.mipagina.com\/autores\/id\/libros\/id\r\n\r\n\/\/ Una p\u00e1gina especifica de un libro\r\nhttps:\/\/api.mipagina.com\/libros\/id\/pagina\/nro-pagina<\/pre>\n<p>La idea es mantener una coherencia que se haga f\u00e1cil entender a qu\u00e9 se refiere cada acci\u00f3n. Adicional para mantener la legibilidad, establecemos el est\u00e1ndar:<\/p>\n<ul>\n<li>Utilizar guiones (-) en vez de guiones bajos (_)<\/li>\n<li>Utilizar solo min\u00fasculas<\/li>\n<li>No usar extensiones de archivo (.jsp,.php,.html, etc)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3>\nUsar m\u00e9todos HTTP para indicar operaciones en recursos<\/h3>\n<p>Los m\u00e1s comunes son para operaciones CRUD:<\/p>\n<ul>\n<li><strong>POST:<\/strong> Crear recursos<\/li>\n<li><strong>GET:<\/strong> Leer recursos<\/li>\n<li><strong>PUT:<\/strong> Actualizar o reemplazar recursos<\/li>\n<li><strong>PATCH:<\/strong> Modificar recursos<\/li>\n<li><strong>DELETE:<\/strong> Eliminar recurso<\/li>\n<\/ul>\n<p>Ejemplos<\/p>\n<pre class=\"lang:xhtml decode:true\">\/\/ Obtener todos los libros\r\nGET https:\/\/api.mipagina.com\/libros\r\n\r\n\/\/ Obtener un libro espec\u00edfico\r\nGET https:\/\/api.mipagina.com\/libros\/id\r\n\r\n\/\/ Crear un libro\r\nPOST https:\/\/api.mipagina.com\/libros\r\n\r\n\/\/ Actualizar un libro\r\nPUT https:\/\/api.mipagina.com\/libros\/id\r\n\r\n\/\/ Borrar un libro\r\nDELETE https:\/\/api.mipagina.com\/libros\/id<\/pre>\n<p>Como se visualiza en el ejemplo, mantenemos el texto en la URL uniforme y cada acci\u00f3n se indica por el verbo del m\u00e9todo HTTP.<br \/>\n&nbsp;<\/p>\n<h3>\nUsar c\u00f3digos de respuesta HTTP adecuados<\/h3>\n<p>Teniendo en cuenta el tipo de c\u00f3digo que devuelve la respuesta, podemos establecer los m\u00e1s comunes para indicar:<\/p>\n<ul>\n<li><strong>200 OK:<\/strong> Indica \u00e9xito.<\/li>\n<li><strong>201 Creado:<\/strong> La creaci\u00f3n se realiz\u00f3 correctamente (a trav\u00e9s de POST o PUT).<\/li>\n<li><strong>204 Sin contenido:<\/strong> Indica \u00e9xito sin una respuesta, se usa com\u00fanmente para solicitudes DELETE y PUT.<\/li>\n<li><strong>400 Solicitud incorrecta:<\/strong> Indica que algo no est\u00e1 bien con la solicitud, por ejemplo, informaci\u00f3n faltante o datos no v\u00e1lidos.<\/li>\n<li><strong>401 No autorizado:<\/strong> Indica credenciales de autenticaci\u00f3n no v\u00e1lidas.<\/li>\n<li><strong>403 Prohibido:<\/strong> Usuario no autorizado para realizar la operaci\u00f3n.<\/li>\n<li><strong>404 No encontrado:<\/strong> Recurso no encontrado.<\/li>\n<li><strong>405 M\u00e9todo no permitido:<\/strong> Indica que existe una URL, pero el m\u00e9todo HTTP no es aplicable.<\/li>\n<li><strong>500 Error interno:<\/strong> Indica que el servidor encontr\u00f3 un error y no sabe c\u00f3mo manejarlo.<\/li>\n<\/ul>\n<p>Tomando en cuenta que no tienes que configurarlos todos, lo com\u00fan es establecer el 200, 201 para modo de confirmaci\u00f3n en tu api y otros se pueden obviar o dejar que el propio servidor los maneje autom\u00e1ticamente.<\/p>\n<p>Si est\u00e1s trabajando en una organizaci\u00f3n seguramente ya tienen sus est\u00e1ndares, sino, puedes aplicar estos est\u00e1ndares en tus proyectos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Representational state transfer (REST) es un estilo de arquitectura de software que se usa para crear aplicaciones de servicios web. Un servicio web que sigue estas pautas se denomina RESTful. Dicho servicio debe proporcionar recursos web en un conjunto predefinido de operaciones con un protocolo sin estado. &nbsp; Condiciones que debe cumplir Cliente-servidor: aplicaci\u00f3n de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":146,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[298],"tags":[301,300,299],"_links":{"self":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/806"}],"collection":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/comments?post=806"}],"version-history":[{"count":6,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/806\/revisions"}],"predecessor-version":[{"id":809,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/806\/revisions\/809"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media\/146"}],"wp:attachment":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media?parent=806"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/categories?post=806"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/tags?post=806"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}