He tenido un debate sobre qué hacer con una barra inclinada final en una API RESTful.
Digamos que tengo un recurso llamado perros y recursos subordinados para perros individuales. Por lo tanto, podemos hacer lo siguiente:
GET/PUT/POST/DELETE http://example.com/dogs
GET/PUT/POST/DELETE http://example.com/dogs/{id}
Pero, ¿qué hacemos con el siguiente caso especial:
GET/PUT/POST/DELETE http://example.com/dogs/
Mi opinión personal es que esto dice enviar una solicitud a un recurso de perro individual con id = null
. Creo que la API debería devolver un 404 para este caso.
Otros dicen que la solicitud está accediendo al recurso perros, es decir, se ignora la barra diagonal final.
¿Alguien sabe la respuesta definitiva?
dogs
ydogs/
como equivalente. Para mí está claro quedogs/
es un directorio que contiene los perros individuales. No está claro quédogs
es, pero lo trataría como equivalente, al igual que la mayoría de los servidores web aceptan accesos a directorios sin el seguimiento/
.Respuestas:
Nada de esto es autoritario (ya que REST no tiene un significado exacto). Pero del documento original sobre REST, una URL completa (que no termina en /) nombra un recurso, mientras que una que termina en una barra inclinada '/' es un grupo de recursos (probablemente no redactado así).
Se supone que una OBTENCIÓN de una URL con una barra diagonal al final enumera los recursos disponibles.
Se supone que un PUT en una URL con una barra diagonal reemplaza todos los recursos.
Se supone que un BORRAR en una URL con una barra diagonal elimina todos los recursos
Se supone que una POST en una URL con una barra diagonal para crear un nuevo recurso se puede acceder posteriormente. Para estar conforme, el nuevo recurso debe estar en este directorio (aunque muchas arquitecturas RESTful engañan aquí).
etc.
La página wiki sobre el tema parece explicarlo bien:
Ver ejemplo https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_Web_services .
fuente
/
/
?GET http://example.com/dogs
puede devolver metainformación sobre los perros (no la lista en sí, sino metainformación sobre la lista de perros). Tal vez o tal vez sea un error.As the last character within a URI’s path, a forward slash (/) adds no semantic value and may cause confusion. It’s better to drop them completely.
Este no es el único lugar que sugiere no usar la barra de entrenamientoNo hay uno, ya que no hay un documento oficial sobre lo que se requiere para que un servicio se considere RESTful.
Dicho esto, permitiría la barra diagonal simplemente por facilidad de uso. Aunque técnicamente hablando, esto podría verse como un intento de acceder a un perro con una identificación nula; No veo a un usuario haciendo este salto a menos que lo hayan leído en su documentación. Puedo ver a un usuario que intenta escribir código en su API e incluye la barra diagonal simplemente por hábito y me pregunto por qué obtienen una respuesta 404 cuando quieren una lista de perros.
fuente
example.com/dogs
es un recurso completamente independiente de cualquier recursoexample.com/dogs/X
. Por lo tanto, un DELETE onexample.com/dogs
no tiene que eliminar todos los perros / * (aunque puede hacerlo si esa es la semántica). Pero DELETEexample.com/dogs/
debería eliminar todos los perros / *.foo
,foo/
yfoo////
de forma idéntica. Básicamente parece eliminar segmentos de ruta vacíos. Entonces, si sigue el mismo enfoque con su servicio REST,dogs
ydogs/
se referiría a lo mismo.Dos caminos.
Método 1
Utilice siempre barras diagonales finales para cualquier recurso que pueda contener elementos secundarios.
Simplemente considere "OBTENER" en un directorio public_html con archivos.
No es posible cuando hello.html es un archivo:
Pero es posible cuando hello.html es un directorio:
Entonces, si "hello.html" alguna vez puede tener hijos, entonces es siempre y para siempre "/hello.html/" y "/hello.html/index.html" (o simplemente /hello.html/) es una lista de estos niños .
Método 2
Se inteligente".
El comando find no se preocupa por el tipo de hello.html. Directorio o archivo, a quién le importa, es el nombre de un objeto. Cuando escribimos "cp youagain.html hello.html", cp puede descubrir cómo manejar hello.html. CP es inteligente. Tu servidor web también es inteligente. Tiene una biblioteca de manejo de ruta. Tiene enrutamiento. Puede generar estadísticas y decirte si un nombre es un objeto o un directorio. Puede redirigir bla a bla / o incluso simplemente ofrecer la misma respuesta para ambos. ¡Esto es increíble! camino. Tanta tecnología. ¿Quién querría simplemente concatenar cadenas de ruta cuando podríamos hacer todo eso?
fuente