Haré esta pregunta de esta manera: ¿cuáles son las preocupaciones de ingeniería de software para no implementar mi API REST de la manera "correcta"?
¿Qué quieres decir con la forma "correcta"? Bueno, permítame explicar mi percepción de la manera correcta, luego le diré cómo lo estoy haciendo (también, suponga que estoy hablando de una API JSON REST).
La direccion correcta
Apatridia. Esta es la parte que sí entiendo. El cliente mantiene el estado siempre el 100% del tiempo para siempre. No es el trabajo del servidor, es del cliente.
Las acciones esperadas y la respuesta para cada verbo:
- GET : obtiene un recurso especificado en su totalidad, solo limitado por la autorización en la solicitud o por un parámetro de consulta. Esto asegura que no se modifique ningún recurso en el proceso.
- POST : dada una descripción completa del recurso (como un objeto JSON), crea un recurso, luego devuelve ese recurso, con cualquier propiedad del servidor también creada, como fechas o ID.
- BORRAR : elimina un recurso especificado, dando solo una especie de 200 OK como respuesta
- PUT : dada una declaración de objeto completa como entrada, actualiza el recurso en una ubicación específica, actualizando todos los campos del recurso a cada uno de los campos dados en la entrada. Para que quede claro, esto espera que todo el objeto se pase como entrada. Se devuelve todo el recurso actualizado, con todos los campos (según la autorización o cualquier otro indicador de entrada).
- PARCHE : dado que solo los campos que se desean modificar para un recurso, se actualizan solo los campos de un recurso específico que se proporcionan como entrada. (Aquí es donde no estoy claro): ¿Se devuelve todo el recurso? (¿O son solo los campos actualizados? No sé. No me importa).
- Rutas de recursos. Dada la relación de los recursos entre sí, una ruta de recursos puede verse como una de:
- / parentresource /: id
- / parentresource /: id / childresource
- / parentresource /: id / childresource /: childId
- / parentresource /: id / childresource /: childId / subresource /: subresourceId (en este ejemplo, un subrecurso pertenece a un childresource, que pertenece a un recurso primario).
La forma en que quiero hacerlo
Lo anterior es mi comprensión de cómo se supone que funciona una API REST. Ahora déjame enumerar algunas de mis variaciones a lo anterior:
- PUT / PATCH - ¿Cuál es el punto de pasar todo el recurso para su modificación? Solo uso PUT para modificar recursos, y solo paso en los campos que quiero actualizar. Como resultado, no necesito usar PATCH
Rutas de recursos: utilizo GUID en mi aplicación. Como resultado, serán globalmente únicos. ¿Por qué necesito la ruta completa de los recursos, incluidos los recursos principales, si solo puedo referirme a un subrecurso por sí solo? Como:
/ subresource /: subresourceId
Si tuviera que hacerlo de la manera "correcta", tratar de hacer referencia a la subresource requeriría una ruta completa como:
/ parentresource /: id / childresource /: childId / subresource /: subresourceId
Es todo lo necesario ? Porque ahora tengo que tener un manejo de errores adicional si mi ruta contiene un: subresourceId que en realidad no es propiedad de un dado: childId, y lo mismo para un: childId que no es propiedad de un padre: id. Mi servidor se encarga de la autorización de recursos. ¿No puedo hacer referencia al recurso en sí, en lugar de la ruta completa?La respuesta de regreso. Digamos, por ejemplo, que mi estructura de datos es un árbol jerárquico, sin límites prácticos en la profundidad del árbol. Los recursos se encuentran en diferentes niveles en el árbol, de forma jerárquica.
- El GET es obvio. Si obtengo este árbol completo, espero el árbol completo como respuesta, con los recursos contenidos dentro de los recursos.
- Si POST para crear un nuevo recurso, PONER para actualizar o ELIMINAR para eliminar, quiero ver los deltas en el árbol, en lugar de solo ver el recurso que creé / actualicé / eliminé. No quiero tener que volver a llamar al GET del árbol principal después de cada POST, PUT o DELETE, especialmente si hay pequeños cambios en el árbol y solo quiero ver los deltas.
Espero que mis preguntas sean claras.
Si tuviera que ver una implementación REST como la describí, ¿lo miraría y me hablaría de sus inquietudes de ingeniería de software? Si es así, ¿cuáles serían?