¿Cuál es la ventaja de usar REST en lugar de HTTP no REST?

Respuestas:

162

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 GETde todos los captadores y POSTpara todos los organismos, tratamos de tener las direcciones URL identifican los recursos, y luego usar las acciones de HTTP GET, POST, PUTy DELETEpara hacer cosas con ellos. Entonces en lugar de

GET /get_article?id=1
POST /delete_article   id=1

Tu harías

GET /articles/1/
DELETE /articles/1/

Y luego POSTy PUTcorresponde 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:

GET /get_article/1/
POST /delete_article/     id=1

O incluso simplemente incluya el verbo en la URL:

GET /read/article/1/
POST /delete/article/1/
POST /update/article/1/
POST /create/article/

En ese caso GETsignifica algo sin efectos secundarios y POSTsignifica 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 todo PUT-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:

POST /hide/article/1/
POST /show/article/1/

(¡O lo que sea, es difícil pensar en ejemplos hasta que sucedan!)

En conclusión, solo puedo ver dos ventajas:

  1. Su API web puede ser más limpia y fácil de entender / descubrir.
  2. Al sincronizar datos con un sitio web, probablemente sea más fácil usar REST porque solo puedes decir 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:

  1. No todas las acciones se asignan fácilmente a CRUD (crear, leer / recuperar, actualizar, eliminar). Es posible que ni siquiera esté tratando con recursos de tipo de objeto.
  2. Es un esfuerzo extra para obtener beneficios dudosos.
  3. Confusión en cuanto a qué sentido PUTy cómo POSTson. 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

GET /timeline_posts     // Returns a list of post IDs.
GET /timeline_posts/1/  // Returns a list of message IDs in the post.
GET /timeline_posts/2/
GET /timeline_posts/3/
GET /message/10/
GET /message/11/
....

Lo cual es un poco ridículo. La API de Facebook es una gran OMI, así que veamos qué hacen:

De forma predeterminada, la mayoría de las propiedades del objeto se devuelven cuando realiza una consulta. Puede elegir los campos (o conexiones) que desea devolver con el parámetro de consulta "campos". Por ejemplo, esta URL solo devolverá la identificación, el nombre y la imagen de Ben: https://graph.facebook.com/bgolub?fields=id,name,picture

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")!

Timmmm
fuente
44
POST y PUT están destinados a ser utilizados por HTTP RFC. En este caso, PUT significa crear / actualizar algo en una ubicación específica, lo que ocurre depende de si algo ya está allí en el URI (y también es idempotente) mientras POST significa que le pide al servicio web que determine dónde colocar lo que está enviándolo, y luego te devuelve el URI (por lo que es solo crear). Realmente no puedo quejarme del inglés, no cuando está completamente apagado usar DELETE cuando se refiere a algo fuera de la computadora. Sin embargo, me pregunto qué hacer con respecto al problema que aparece en su edición: P
Nan L
77
El ejemplo de la API de Facebook me parece REST (en realidad mucho más para que tus ejemplos usen verbos en las URL). No hay ninguna razón por la cual los parámetros de consulta no puedan ser RESTful, solo es una buena práctica usar rutas donde los datos se pueden organizar en jerarquía.
Justin Emery
55
Las cadenas de consulta son perfectamente RESTful siempre que no haga referencias a recursos en ellas. Tiendo a pensar en ellos más como filtros que pueden modificar el comportamiento del punto final.
Sinaesthetic
3
-1, REST es algo muy específico, como lo describió Roy Fielding cuando lo inventó. Mira esta respuesta . particularmente: "El cliente solo necesita conocer el URI inicial, y posteriormente elige entre las opciones proporcionadas por el servidor para navegar o realizar acciones". . Básicamente, si alguna parte de una API documenta los puntos finales, por ejemplo, dice "dada una identificación de usuario, puede obtener información del usuario /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?
Claudiu
1
(continuación ...) Que otras personas hagan mal uso del término no cambia lo que es. Descargo de responsabilidad, sin embargo: todavía estoy aprendiendo qué es REST y esto es lo que hizo clic para mí recientemente.
Claudiu
47

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:

  • Sencillo.
  • Puede hacer un buen uso de la caché HTTP y el servidor proxy para ayudarlo a manejar una carga alta.
  • Le ayuda a organizar incluso una aplicación muy compleja en recursos simples.
  • Facilita a los nuevos clientes el uso de su aplicación, incluso si no la ha diseñado específicamente para ellos (probablemente, porque no existían cuando creó su aplicación).
Emil Ivanov
fuente
11
"Simple": ¿Por qué REST es más simple que HTTP?
Dimitri C.
55
"te ayuda a organizar": ¿Entonces esta organización es más difícil cuando solo usas GET y POST?
Dimitri C.
1
"Facilita a los nuevos clientes el uso de su aplicación": se trata de REST frente a HTTP simple, ¿verdad?
Dimitri C.
23
Cumplir con las restricciones REST definitivamente no es simple. En ocasiones, es muy difícil exprimir operaciones comerciales complejas en cuatro verbos estándar. Sin embargo, cuando se hace bien, el resultado final puede ser simple de comprender, pero llegar allí es todo lo contrario.
Darrel Miller
66
@Dimitri: "Simple" porque te brinda un marco simple para trabajar. REST es HTTP! Es mucho más simple que SOAP (que incluso tiene un nombre simple). "le ayuda a organizarse": el concepto no es muy difícil de comprender y, una vez implementado correctamente, hace las cosas muy bien. REST puede ser una forma de diseñar la aplicación, en lugar de un detalle de implementación. Como señala Darrel, implementarlo podría no ser fácil, pero el resultado es gratificante. "Facilita a los nuevos clientes el uso de su aplicación" - Nuevamente: REST es HTTP.
Emil Ivanov
31

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:

  • Sencillo.
  • Puede hacer un buen uso de la caché HTTP y el servidor proxy para ayudarlo a manejar una carga alta.
  • Le ayuda a organizar incluso una aplicación muy compleja en recursos simples.
  • Facilita a los nuevos clientes el uso de su aplicación, incluso si no la ha diseñado específicamente para ellos (probablemente, porque no existían cuando creó su aplicación).

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.

Petr Peller
fuente
3
Por lo general, las API de reposo son más fáciles de almacenar en caché porque separa los datos en recursos que tienen el mismo ciclo de vida (se crean y actualizan al mismo tiempo) para que pueda almacenar en caché de manera confiable y la recuperación de la memoria caché, mientras que las API sin reposo a menudo devuelven datos que tienen ha sido procesado en gran medida o es un conglomerado de múltiples entidades que dificulta el almacenamiento en caché
Scott Schulthess
2
correcto, no es mutuamente exclusivo (puede tener una API que no sea de reposo que se puede almacenar en caché), pero adoptar un enfoque de descanso para el diseño de la API fomenta y en la práctica es definitivamente relevante, ya que fomenta varias mejores prácticas (capacidad de descubrimiento, interfaces genéricas, capacidad de almacenamiento, modelado inteligente de recursos )
Scott Schulthess
44
"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". No estoy seguro de lo que quieres decir con esto. Es perfectamente posible (y no más difícil que construir una API que no sea REST) ​​crear una API RESTful sin usar un marco adicional del lado del servidor.
Michael O.
2
"Con REST necesitas una capa de comunicación adicional" - humbug, puedes usar tu biblioteca HTTP existente perfectamente.
Søren Boisen
1
@ SørenBoisen Esta respuesta es un poco vieja. Probablemente debería actualizarlo para reflejar más el estado actual de las cosas.
Petr Peller
23

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.

Darrel Miller
fuente
44
¿Podrías dar un ejemplo? ¡Gracias!
Jan Żankowski
3
¿No dependería eso de cuán abastrado fuera su API que no es REST?
Johnny
@johnny Es posible, pero poco probable. Las restricciones de REST fueron elegidas para permitir explícitamente la evolución independiente de los componentes. Si ha encontrado una manera de hacerlo mejor sin aplicar las mismas restricciones, entonces estoy seguro de que a mucha gente le gustaría saberlo.
Darrel Miller
@DarrelMiller ¿Puede explicar cómo REST reduce el acoplamiento cliente / servidor mejor que el enfoque http No REST? Creo que estás apuntando hacia el punto que Timmmm dijo en su respuesta. Vea el último comentario mío bajo la respuesta de
Timmmm
Los sistemas @emilly REST no dependen de información fuera de banda para poder procesar la respuesta. No hay suposiciones que deben hacerse sobre lo que podría regresar de una solicitud en particular. La respuesta te dice todo lo que necesitas saber. Esto permite que un servidor cambie su comportamiento y el cliente puede estar al tanto de esos cambios.
Darrel Miller
15

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 retrievey en su definelugar. 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 GETun recurso que no existe, puede estar seguro de recibir un 404error 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:

GET /products/1052/reviews
POST /products/1052/reviews       "5 stars"
DELETE /products/1052/reviews/10
GET /products/1052/reviews/10

HTTP:

GET /reviews?product_id=1052
POST /post_review?product_id=1052                  "5 stars"
POST /remove_review?product_id=1052&review_id=10
GET /reviews?product_id=1052&review=10

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?

BoppreH
fuente
Se supone que esta no es una lista exhaustiva y contiene solo ventajas muy prácticas.
BoppreH
Esta es una respuesta muy inteligente, aplaudo.
EralpB
10

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:

  • en qué clases están,
  • qué calificaciones están obteniendo,
  • contactos de emergencia,
  • información sobre los libros que enseñas, etc.

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.

marcgg
fuente
66
Esposa: ¿Es esta otra cosa del robot?
Tobu
44
Este es un buen texto, pero no dio ningún ejemplo de por qué sería malo usar GET y POST para todo.
Dimitri C.
9
Es por eso que trato de descubrir por qué es mejor :-)
Dimitri C.
77
La escritura ha sido retirada.
surfen
2
@surfen waybackmachine
felickz
5

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.

DreifGenov
fuente
3

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.

Miguel
fuente
3
¿Puede dar un ejemplo de lo que podría almacenarse en caché y por qué el almacenamiento en caché no sucedería con una solución que no sea REST?
Dimitri C.
2
@Dimitri C .: Un proxy wikipedia.org/article?id=19 no guardará en caché un enlace , ya que ignora los parámetros pasados ​​en la url. Por otro lado, un enlace wikipedia.org/REST sería almacenado en caché, ¿entendido?
VP.
66
Si el almacenamiento en caché fue el principal beneficio de REST, puedo asegurarle que no habría pasado los últimos dos años construyendo servicios RESTful.
Darrel Miller
Querido, podrías estar construyendo sistemas que están en una escala de distribución en la que el acoplamiento suelto es de suma importancia (interesado en saber qué tipo de sistemas son estos), pero la mayoría de las personas no lo están, o están usando tecnologías (es decir navegadores y html) en los que una gran mayoría del trabajo duro se realiza para ellos.
Mike
1
Entonces, ¿por qué no solo usar GET /get_article/19/y POST /update_articlesi el almacenamiento en caché es su preocupación? Todavía se puede hacer todo con sólo GETe POSTy creo que RESTsignifica "Uso GET, POST, PUTy DELETEsolamente." y no solo "No use cadenas de consulta". entonces lo que sugerí no sería REST. Por otra parte, nadie puede realmente estar de acuerdo con lo que REST es, así que lo estoy poniendo en un cubo con "Web 2.0".
Timmmm
3

Está escrito en la tesis de Fielding . Pero si no quieres leer mucho:

  • mayor escalabilidad (debido a restricciones de sistema sin capas, en caché y en capas)
  • cliente y servidor desacoplados (debido a restricciones de interfaz sin estado y uniformes)
    • clientes reutilizables (el cliente puede usar navegadores REST generales y semántica RDF para decidir qué enlace seguir y cómo mostrar los resultados)
    • clientes que no se rompen (los clientes se rompen solo por cambios semánticos específicos de la aplicación, porque usan la semántica en lugar de algunos conocimientos específicos de API)
inf3rno
fuente
0
  • Dar a cada "recurso" una identificación
  • Vincula cosas
  • Utiliza métodos estándar
  • Recursos con múltiples representaciones
  • Comunícate sin estado

¿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?

VP.
fuente
1
"sería posible hacer todo usando solo GET": ya hice algunos experimentos con HTTP GET en Silverlight. Mi conclusión fue que los mensajes GET tienen un tamaño considerablemente limitado, mientras que los mensajes POST pueden ser más grandes (nuevamente: en la configuración de Silverlight). ¡Por lo tanto, elegiría usar HTTP POST para todo! :-)
Dimitri C.
Ambas soluciones están en contra de los estándares. Hacer todo a través de POST no es bueno, especialmente para consultas. Tenga en cuenta que en los últimos años todos los motores de búsqueda que solían funcionar como GET funcionan ahora como GET. ¿Por qué? porque el método "get" tiene esta capacidad de ser arañado ...
VP.
0

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.

Balaji
fuente
1
La descripción de un servicio web RESTful con un documento WADL derrota una de las principales ventajas de REST, en particular, todas las ventajas obtenidas de hipermedia.
Thomas Eizinger
@ThomasEizinger ¿Es realmente un WADL algo tan malo? Actualmente estamos trabajando con otra compañía que no ha proporcionado un WADL, devuelve objetos json dependiendo de lo que contenga nuestra solicitud. Supongo que WADL sería útil para aclarar las ideas.
surfmuggle
WADL hace un gran trabajo al describir una API HTTP, porque para eso fue diseñada. Dependiendo del servicio que brinde esta compañía, un WADL puede o no ser una buena idea. Si el servicio no aprovecha los hipermedios y solo serializa algunos objetos en JSON, también deben proporcionar una documentación (WADL, Swagger, etc.) sobre cómo funciona su servicio y qué espera / devuelve. WADL per se no es malo en absoluto, simplemente no es la herramienta adecuada para un servicio web (verdaderamente) RESTful.
Thomas Eizinger
0

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 ...

Vijay Jana
fuente
0

@Timmmm, sobre tu edición:

GET /timeline_posts     // could return the N first posts, with links to fetch the next/previous N posts

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

"No todas las acciones se asignan fácilmente a CRUD (crear, leer / recuperar, actualizar, eliminar)".

: 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

"Puede que ni siquiera estés tratando con recursos de tipo de objeto"

: 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.

Quel Qun
fuente
-1

Los motores de búsqueda pueden ignorar las cadenas de consulta.

melancólico
fuente
8
Usar la cadena de consulta es totalmente RESTful.
Emil Ivanov
Dimitri, algunos motores de búsqueda ignoran los enlaces dinámicos. Ya no tanto, pero todavía está mal visto. Si ejecuta un sitio pequeño, entonces googlebot podría no indexar todas sus páginas si tienen un signo de interrogación en la ruta.
melancólico 03 de
3
... lo cual es simplemente falso, cuando mencionas Google: googlewebmastercentral.blogspot.com/2008/09/…
Boldewyn
-1 para las cadenas de consulta no es ignorado por los motores de búsqueda. webmasters.googleblog.com/2008/09/…
hombre de bronce