J'ai eu un débat sur ce qu'il faut faire avec une barre oblique de fin dans une API RESTful.
Disons que j'ai une ressource appelée chiens et ressources subordonnées pour des chiens individuels. Nous pouvons donc faire ce qui suit:
GET/PUT/POST/DELETE http://example.com/dogs
GET/PUT/POST/DELETE http://example.com/dogs/{id}
Mais que faisons-nous avec le cas particulier suivant:
GET/PUT/POST/DELETE http://example.com/dogs/
Mon opinion personnelle est que cela signifie envoyer une demande à une ressource de chien individuelle avec id = null
. Je pense que l'API devrait renvoyer un 404 pour ce cas.
D'autres disent que la demande accède à la ressource chiens, c'est-à-dire que la barre oblique finale est ignorée.
Est-ce que quelqu'un connaît la réponse définitive?
dogs
etdogs/
comme équivalent. Pour moi, il est clair quedogs/
c'est un répertoire contenant les chiens individuels. Ce quidogs
est moins clair , mais je considérerais cela comme équivalent, tout comme la plupart des serveurs Web acceptent les accès aux répertoires sans suivi/
.Réponses:
Rien de tout cela ne fait autorité (car REST n'a pas de signification exacte). Mais dans le document original sur REST, une URL complète (ne se terminant pas par /) nomme une ressource, tandis que celle se terminant par une barre oblique '/' correspond à un groupe de ressources (probablement pas rédigé de la sorte).
Un GET d'une URL avec une barre oblique à la fin est censé répertorier les ressources disponibles.
Un PUT sur une URL avec une barre oblique est supposé remplacer toutes les ressources.
Un DELETE sur une URL avec une barre oblique est supposé supprimer toutes les ressources
Un POST sur une URL avec une barre oblique est censé créer une nouvelle ressource peut ensuite être consulté. Pour être conforme, la nouvelle ressource doit se trouver dans ce répertoire (bien que de nombreuses architectures RESTful trichent ici).
etc.
La page wiki sur le sujet semble bien l'expliquer:
Voir les exemples https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_Web_services .
la source
/
/
?GET http://example.com/dogs
peut renvoyer des méta-informations sur les chiens (pas la liste elle-même, mais des méta-informations sur la liste des chiens). Peut-être ou peut-être que c'est une erreur.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.
Ce n'est pas le seul endroit qui suggère de ne pas utiliser l'entraînement slashIl n'y en a pas car il n'y a pas de document officiel sur ce qui est requis pour qu'un service soit considéré comme RESTful.
Cela dit, j'autoriserais le slash final simplement pour la facilité d'utilisation. Techniquement, cela pourrait être perçu comme une tentative d'accès à un chien avec un identifiant nul; Je ne vois pas un utilisateur faire ce saut à moins de l'avoir lu dans votre documentation. Je peux voir un utilisateur qui tente d'écrire du code par rapport à votre API et inclut la barre oblique finale simplement par habitude et se demande pourquoi il obtient une réponse 404 lorsqu'il veut une liste de chiens.
la source
example.com/dogs
est une ressource totalement indépendante de toute ressourceexample.com/dogs/X
. Ainsi, un DELETE surexample.com/dogs
ne doit pas supprimer tous les chiens / * (bien que cela puisse être le cas si c'est la sémantique). Mais DELETEexample.com/dogs/
devrait supprimer tous les chiens / *.foo
,foo/
, et de manièrefoo////
identique. Il semble fondamentalement dépouiller les segments de chemin vides. Donc, si vous suivez la même approche avec votre service REST,dogs
etdogs/
se réfère à la même chose.Deux façons.
Méthode 1
Utilisez toujours des barres obliques de fin pour toute ressource pouvant contenir des enfants.
Considérez simplement "GET" sur un répertoire public_html avec des fichiers.
Pas possible quand hello.html est un fichier:
Mais possible quand hello.html est un répertoire:
Donc, si "hello.html" peut avoir des enfants, il est toujours et toujours "/hello.html/" et "/hello.html/index.html" (ou simplement /hello.html/) est une liste de ces enfants .
Méthode 2
Soyez "intelligent".
La commande find ne se soucie pas du type de hello.html. Répertoire ou fichier, peu importe, c'est le nom d'un objet. Lorsque nous écrivons "cp youagain.html hello.html", cp peut comprendre comment gérer hello.html. cp est intelligent. Votre serveur Web est intelligent aussi. Il a une bibliothèque de gestion de chemin. Il a routage. Il peut stat et vous dire si un nom est un objet ou un répertoire. Il peut rediriger bla à bla / ou même simplement donner la même réponse pour les deux. C'est le génial !!! façon. Tant de technologie. Qui voudrait jamais simplement concaténer des chaînes de chemin quand on pourrait faire tout ça ???
la source