Los lectores nuevos en este tema se sorprenderán con la discusión interminable sobre lo que debe hacer y la relativa ausencia de lecciones de la experiencia. El hecho de que REST sea "preferido" sobre SOAP es, supongo, un aprendizaje de alto nivel de la experiencia, pero ¿Dios debe haber progresado desde allí? Es 2016. La tesis de Roy fue en 2000. ¿Qué hemos desarrollado? ¿Fue divertido? ¿Fue fácil integrarse? ¿Apoyar? ¿Manejará el auge de los teléfonos inteligentes y las conexiones móviles inestables?
Según ME, las redes de la vida real no son confiables. Solicitudes de tiempo de espera. Se restablecen las conexiones. Las redes se caen durante horas o días a la vez. Los trenes van a túneles con usuarios móviles a bordo. Para cualquier solicitud dada (como se reconoce ocasionalmente en toda esta discusión), la solicitud puede caer en el agua en su camino, o la respuesta puede caer en el agua en su camino de regreso. En estas condiciones, emitir solicitudes PUT, POST y DELETE directamente contra recursos sustantivos siempre me ha parecido un poco brutal e ingenuo.
HTTP no hace nada para garantizar la finalización confiable de la solicitud-respuesta, y eso está bien porque este es adecuadamente el trabajo de las aplicaciones conscientes de la red. Al desarrollar una aplicación de este tipo, puede saltar a través de los aros para usar PUT en lugar de POST, luego más aros para dar un cierto tipo de error en el servidor si detecta solicitudes duplicadas. De vuelta en el cliente, debe saltar por los aros para interpretar estos errores, volver a buscar, revalidar y volver a publicar.
O puede hacer esto : considere sus solicitudes inseguras como recursos efímeros de un solo usuario (llamémoslas acciones). Los clientes solicitan una nueva "acción" en un recurso sustantivo con una POST vacía al recurso. POST se usará solo para esto. Una vez que posee de forma segura el URI de la acción recién emitida, el cliente PONE la solicitud insegura al URI de acción, no el recurso objetivo . Resolver la acción y actualizar el recurso "real" es adecuadamente el trabajo de su API, y aquí se desacopla de la red no confiable.
El servidor hace el negocio, devuelve la respuesta y la almacena contra el URI de acción acordado . Si algo sale mal, el cliente repite la solicitud (¡comportamiento natural!), Y si el servidor ya lo ha visto, repite la respuesta almacenada y no hace nada más .
Rápidamente detectará la similitud con las promesas: creamos y devolvemos el marcador de posición para el resultado antes de hacer nada. También como una promesa, una acción puede tener éxito o fracasar una vez, pero su resultado se puede obtener repetidamente.
Lo mejor de todo es que brindamos a las aplicaciones de envío y recepción la oportunidad de vincular la acción identificada de forma única con la unicidad en sus respectivos entornos. ¡Y podemos comenzar a exigir y hacer cumplir !, un comportamiento responsable de los clientes: repita sus solicitudes tanto como desee, pero no vaya a generar una nueva acción hasta que esté en posesión de un resultado definitivo de la existente.
Como tal, numerosos problemas espinosos desaparecen. Las solicitudes de inserción repetidas no crearán duplicados, y no creamos el recurso real hasta que tengamos los datos. (las columnas de la base de datos pueden permanecer no anulables). Las solicitudes de actualización repetidas no afectarán a los estados incompatibles y no sobrescribirán los cambios posteriores. Los clientes pueden (re) buscar y procesar sin problemas la confirmación original por cualquier motivo (el cliente se bloqueó, la respuesta se perdió, etc.).
Las solicitudes de eliminación sucesivas pueden ver y procesar la confirmación original, sin dar con un error 404. Si las cosas tardan más de lo esperado, podemos responder provisionalmente, y tenemos un lugar donde el cliente puede verificar el resultado definitivo. La mejor parte de este patrón es su propiedad Kung-Fu (Panda). Tomamos una debilidad, la propensión a que los clientes repitan una solicitud cada vez que no entienden la respuesta, y la convertimos en una fortaleza :-)
Antes de decirme que esto no es RESTful, considere las numerosas formas en que se respetan los principios REST. Los clientes no construyen URL. La API permanece reconocible, aunque con un pequeño cambio en la semántica. Los verbos HTTP se usan apropiadamente. Si cree que este es un gran cambio para implementar, puedo decirle por experiencia que no lo es.
Si cree que tendrá grandes cantidades de datos para almacenar, hablemos de volúmenes: una confirmación de actualización típica es una fracción de kilobyte. HTTP actualmente le da un minuto o dos para responder definitivamente. Incluso si solo almacena acciones durante una semana, los clientes tienen muchas posibilidades de ponerse al día. Si tiene volúmenes muy altos, es posible que desee un almacén de valores clave dedicado que cumpla con el ácido o una solución en memoria.