Il y a une subtile ambiguïté conceptuelle lorsque les gens parlent d' "URI relative".
Par la définition de la RFC3986, une URI générique contient :
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
La chose délicate est que, lorsque le schéma et l'autorité sont omis, la partie "chemin" peut elle-même être soit un chemin absolu (commençant par /
), soit un chemin relatif "rootless". Exemples :
- Une URI absolue ou une URI complète :
"http://example.com:8042/over/there?name=ferret"
- Et voici une URI relative, avec un chemin absolu :
/over/there
- Et voici une URI relative, avec un chemin relatif :
ici
ou ./ici
ou ../ici
ou etc.
Donc, si la question était "si un serveur devrait produire un chemin relatif dans une réponse restful", la réponse est "Non" et la raison détaillée est disponible ici. Je pense que la plupart des gens (dont moi) qui s'opposent aux "URI relatives" s'opposent en fait aux "chemins relatifs".
Et en pratique, la plupart des frameworks MVC côté serveur peuvent facilement générer des URI relatifs avec un chemin absolu tel que /chemin/absolu/vers/le/contrôleur
, et la question devient "si l'implémentation du serveur devrait préfixer un schéma://nomhôte:port
devant le chemin absolu". Comme la question de l'auteur original. Je ne suis pas très sûr à ce sujet.
D'un côté, je continue de penser qu'il est recommandé que le serveur renvoie une uri complète. Cependant, le serveur ne devrait jamais intégrer en dur le nomhôte:port
dans le code source comme ça (sinon je préférerais tomber en arrière sur une uri relative avec un chemin absolu). La solution est que le serveur obtient toujours ce préfixe à partir de l'en-tête "Host" de la requête HTTP. Pas sûr que cela fonctionne pour toutes les situations cependant.
D'un autre côté, il ne semble pas très contraignant pour le client de concaténer le http://example.com:8042
et le chemin absolu. Après tout, le client connait déjà le schéma et le nom de domaine lorsqu'il envoie la requête au serveur, n'est-ce pas ?
En fin de compte, je dirais, recommander d'utiliser une URI absolue, éventuellement revenir à une URI relative avec un chemin absolu, ne jamais utiliser de chemin relatif.