Aparentemente, REST es solo un conjunto de convenciones sobre cómo usar HTTP . Me pregunto qué ventaja proporcionan estas convenciones. ¿Alguien sabe?
161
Aparentemente, REST es solo un conjunto de convenciones sobre cómo usar HTTP . Me pregunto qué ventaja proporcionan estas convenciones. ¿Alguien sabe?
Respuestas:
No creo que obtenga una buena respuesta a esto, en parte porque nadie está de acuerdo en qué es REST . La página de wikipedia tiene muchas palabras de moda y poca explicación. Vale la pena echar un vistazo a la página de discusión solo para ver cuánta gente no está de acuerdo con esto. Sin embargo, hasta donde puedo decir, REST significa esto:
En lugar de tener direcciones URL setter y getter nombre aleatorio y el uso
GET
de todos los captadores yPOST
para todos los organismos, tratamos de tener las direcciones URL identifican los recursos, y luego usar las acciones de HTTPGET
,POST
,PUT
yDELETE
para hacer cosas con ellos. Entonces en lugar deTu harías
Y luego
POST
yPUT
corresponde a las operaciones "crear" y "actualizar" (pero nadie está de acuerdo en qué sentido).Creo que los argumentos de almacenamiento en caché están equivocados, porque las cadenas de consulta son por lo general almacenan en caché, y además de que en realidad no necesitan para su uso. Por ejemplo, django hace que algo como esto sea muy fácil, y no diría que fue REST:
O incluso simplemente incluya el verbo en la URL:
En ese caso
GET
significa algo sin efectos secundarios yPOST
significa algo que cambia los datos en el servidor. Creo que esto es quizás un poco más claro y fácil, especialmente porque puedes evitar todoPUT
-vs-POST
. Además, puede agregar más verbos si lo desea, por lo que no está vinculado artificialmente a lo que ofrece HTTP. Por ejemplo:(¡O lo que sea, es difícil pensar en ejemplos hasta que sucedan!)
En conclusión, solo puedo ver dos ventajas:
synchronize("/articles/1/")
o lo que sea. Esto depende en gran medida de su código.Sin embargo, creo que hay algunas desventajas bastante grandes:
PUT
y cómoPOST
son. En inglés significan cosas similares ("Voy a poner / publicar un aviso en el muro").En conclusión, diría: a menos que realmente quiera hacer un esfuerzo adicional, o si su servicio se asigna realmente bien a las operaciones CRUD, guarde REST para la segunda versión de su API.
Acabo de encontrar otro problema con REST: no es fácil hacer más de una cosa en una solicitud o especificar qué partes de un objeto compuesto desea obtener. Esto es especialmente importante en dispositivos móviles donde el tiempo de ida y vuelta puede ser significativo y las conexiones no son confiables. Por ejemplo, suponga que está recibiendo publicaciones en una línea de tiempo de Facebook. El modo REST "puro" sería algo así como
Lo cual es un poco ridículo. La API de Facebook es una gran OMI, así que veamos qué hacen:
No tengo idea de cómo harías algo así con REST, y si lo hicieras, si todavía contaría como REST. Sin embargo, ignoraría a cualquiera que intente decirte que no debes hacer eso (¡especialmente si la razón es "porque no es REST")!
fuente
/user/{id}
, entonces no es tranquila. Considere: su navegador tiene que venir preprogramado sabiendo cómo obtener el HTML para una pregunta de stackoverflow página?En pocas palabras, REST significa usar HTTP como debe ser.
Echa un vistazo a la disertación de Roy Fielding sobre REST . Creo que toda persona que esté haciendo desarrollo web debería leerlo.
Como nota, Roy Fielding es uno de los controladores clave detrás del protocolo HTTP, también.
Para nombrar algunos de los avances:
fuente
En pocas palabras: NINGUNO .
Siéntase libre de votar negativamente, pero sigo pensando que no hay beneficios reales sobre HTTP no REST. Todas las respuestas actuales son inválidas. Argumentos de la respuesta más votada actualmente:
1. simple
Con REST necesita una capa de comunicación adicional para sus scripts del lado del servidor y del lado del cliente => en realidad es más complicado que el uso de HTTP no REST.
2. Almacenamiento en caché
El almacenamiento en caché se puede controlar mediante encabezados HTTP enviados por el servidor. REST no agrega ninguna característica que falta en no REST.
3. Organización
REST no te ayuda a organizar las cosas. Te obliga a usar API compatible con la biblioteca del lado del servidor que estás usando. Puede organizar su aplicación de la misma manera (o mejor) cuando usa un enfoque que no es REST. Por ejemplo, ver Modelo-Vista-Controlador o enrutamiento MVC .
4. Fácil de usar / implementar
No es cierto del todo. Todo depende de qué tan bien organice y documente su aplicación. REST no mejorará mágicamente su aplicación.
fuente
En mi humilde opinión, la mayor ventaja que REST permite es la de reducir el acoplamiento cliente / servidor. Es mucho más fácil desarrollar una interfaz REST con el tiempo sin romper los clientes existentes.
fuente
Descubrimiento
Cada recurso tiene referencias a otros recursos, ya sea en jerarquía o enlaces, por lo que es fácil de navegar. Esto es una ventaja para el ser humano que desarrolla al cliente, lo que le evita consultar constantemente los documentos y ofrecer sugerencias. También significa que el servidor puede cambiar los nombres de los recursos unilateralmente (siempre que el software del cliente no codifique las URL).
Compatibilidad con otras herramientas.
Puede CURLAR en cualquier parte de la API o usar el navegador web para navegar por los recursos. Hace que la depuración y las pruebas de integración sean mucho más fáciles.
Nombres verbales estandarizados
Le permite especificar acciones sin tener que buscar la redacción correcta. Imagínese si los captadores y establecedores de OOP no estuvieran estandarizados, y algunas personas lo usaran
retrieve
y en sudefine
lugar. Tendría que memorizar el verbo correcto para cada punto de acceso individual. Saber que solo hay un puñado de verbos disponibles contrarresta ese problema.Estado estandarizado
Si tiene
GET
un recurso que no existe, puede estar seguro de recibir un404
error en una API RESTful. Contraste con una API no RESTful, que puede regresar{error: "Not found"}
envuelta en Dios sabe cuántas capas. Si necesita el espacio extra para escribir un mensaje al desarrollador en el otro lado, siempre puede usar el cuerpo de la respuesta.Ejemplo
Imagine dos API con la misma funcionalidad, una después de REST y la otra no. Ahora imagine los siguientes clientes para esas API:
Sosegado:
HTTP:
Ahora piense en las siguientes preguntas:
Si la primera llamada de cada cliente funcionó, ¿qué tan seguro puede estar de que el resto también funcionará?
Hubo una actualización importante de la API que puede o no haber cambiado esos puntos de acceso. ¿Qué cantidad de documentos tendrás que volver a leer?
¿Puedes predecir el regreso de la última consulta?
Debe editar la revisión publicada (antes de eliminarla). ¿Puedes hacerlo sin consultar los documentos?
fuente
Recomiendo echar un vistazo a Cómo expliqué REST a mi esposa de Ryan Tomayko
Edición de terceros
Extracto del enlace waybackmaschine:
¿Qué tal un ejemplo? Eres profesor y quieres gestionar estudiantes:
Si los sistemas están basados en la web, entonces es probable que haya una URL para cada uno de los nombres involucrados aquí:
student, teacher, class, book, room, etc
. ... Si hubiera una representación legible por máquina para cada URL, sería trivial vincular nuevas herramientas al sistema porque toda esa información sería consumible de manera estándar. ... podría construir un sistema en todo el país que pudiera hablar con cada uno de los sistemas escolares individuales para recopilar los puntajes de los exámenes.Cada uno de los sistemas obtendría información el uno del otro utilizando un simple HTTP GET. Si un sistema necesita agregar algo a otro sistema, usaría una POST HTTP. Si un sistema desea actualizar algo en otro sistema, utiliza un PUT HTTP. Lo único que queda por descubrir es cómo deberían verse los datos.
fuente
Sugeriría a todos los que estén buscando una respuesta a esta pregunta que pasen por esta "presentación de diapositivas" .
No podía entender qué es REST y por qué es tan genial, sus pros y sus contras, sus diferencias con SOAP, pero esta presentación de diapositivas fue tan brillante y fácil de entender, por lo que ahora es mucho más claro para mí que antes.
fuente
Almacenamiento en caché.
Hay otros beneficios más profundos de REST que giran en torno a la capacidad de evolución mediante acoplamiento flexible e hipertexto, pero los mecanismos de almacenamiento en caché son la razón principal por la que debería preocuparse por HTTP RESTful.
fuente
GET /get_article/19/
yPOST /update_article
si el almacenamiento en caché es su preocupación? Todavía se puede hacer todo con sóloGET
ePOST
y creo queREST
significa "UsoGET
,POST
,PUT
yDELETE
solamente." y no solo "No use cadenas de consulta". entonces lo que sugerí no seríaREST
. Por otra parte, nadie puede realmente estar de acuerdo con lo queREST
es, así que lo estoy poniendo en un cubo con "Web 2.0".Está escrito en la tesis de Fielding . Pero si no quieres leer mucho:
fuente
¿Es posible hacer todo solo con POST y GET? Sí, ¿es el mejor enfoque? ¿No porque? Porque tenemos métodos estándar. Si lo piensas de nuevo, sería posible hacer todo usando GET ... entonces, ¿por qué deberíamos molestarnos en usar POST? ¡Por los estándares!
Por ejemplo, hoy pensando en un modelo MVC, puede limitar su aplicación para responder solo a tipos específicos de verbos como POST, GET, PUT y DELETE. Incluso si debajo del capó todo se emula para POST y GET, ¿no tiene sentido tener verbos diferentes para diferentes acciones?
fuente
El descubrimiento es mucho más fácil en REST. Tenemos documentos WADL (similares a WSDL en los servicios web tradicionales) que lo ayudarán a anunciar su servicio al mundo. También puede usar los descubrimientos UDDI. Con HTTP POST y GET tradicionales, las personas pueden no conocer su solicitud de mensaje y los esquemas de respuesta para llamarlo.
fuente
Una ventaja es que podemos procesar documentos XML de forma no secuencial y datos XML desordenados de diferentes fuentes como el objeto InputStream, una URL, un nodo DOM ...
fuente
@Timmmm, sobre tu edición:
Esto reduciría drásticamente la cantidad de llamadas
Y nada le impide diseñar un servidor que acepte parámetros HTTP para denotar los valores de campo que sus clientes pueden desear ...
Pero esto es un detalle.
Mucho más importante es el hecho de que no mencionó las enormes ventajas del estilo arquitectónico REST (escalabilidad mucho mejor, debido a la apatridia del servidor; disponibilidad mucho mejor, también debido a la apatridia del servidor; uso mucho mejor de los servicios estándar, como el almacenamiento en caché para ejemplo, cuando se usa un estilo arquitectónico REST; un acoplamiento mucho menor entre el cliente y el servidor, debido al uso de una interfaz uniforme; etc. etc.)
En cuanto a tu comentario
: un RDBMS también utiliza un enfoque CRUD (SELECCIONAR / INSERTAR / ELIMINAR / ACTUALIZAR), y siempre hay una forma de representar y actuar sobre un modelo de datos.
Sobre tu sentencia
: un diseño RESTful es, en esencia, un diseño simple, pero esto NO significa que diseñarlo sea simple. Ves la diferencia ? Tendrá que pensar mucho sobre los conceptos que su aplicación representará y manejará, lo que debe hacer por ella, si lo prefiere, para representar esto mediante recursos. Pero si lo hace, terminará con un diseño más simple y eficiente.
fuente
Los motores de búsqueda pueden ignorar las cadenas de consulta.
fuente