Contexte (question plus bas)
J'ai fait des recherches sur Google en lisant les RFC et les questions de l'OS pour essayer de résoudre ce problème, mais je n'ai toujours rien compris.
Je suppose donc que nous votons pour la "meilleure" réponse et que c'est tout, ou bien ?
En gros, cela se résume à ceci.
3.4. Composant de requête
La composante "requête" est une chaîne d'informations à interpréter par la ressource.
query = *uric
Dans un composant de requête, les caractères " ;", "/", " ?", " :", "@", "&", "=", "+", "," et "$" sont réservés.
La première chose qui m'étonne est que *uric est défini comme suit
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Ce point est toutefois quelque peu clarifié par des paragraphes tels que
La classe syntaxique "réservée" ci-dessus fait référence aux caractères qui sont autorisés dans un URI, mais qui peuvent ne pas être autorisés dans un composant particulier de la syntaxe générique de l'URI ; ils sont utilisés comme délimiteurs des composants décrits à la section 3.
Les caractères de l'ensemble "réservé" ne sont pas réservés dans tous les contextes. L'ensemble des caractères effectivement réservés dans un composant URI donné est défini par ce composant. En général, un caractère est réservé si la sémantique de l'URI change si le caractère est remplacé par son codage US-ASCII échappé.
Ce dernier extrait semble quelque peu rétrograde, mais il indique clairement que le jeu de caractères réservés dépend du contexte. Pourtant, le paragraphe 3.4 indique que tous les caractères réservés sont réservés dans un composant de requête, mais la seule chose qui changerait la sémantique ici est l'échappement du point d'interrogation ( ?), car les URI ne définissent pas le concept de chaîne de requête.
À ce stade, j'ai complètement abandonné les RFC, mais j'ai trouvé le RFC 1738 particulièrement intéressant.
Une URL HTTP se présente sous la forme suivante :
http://<host>:<port>/<path>?<searchpart>
Dans les composants <path> et <searchpart>, les caractères "/", " ;", " ?" sont réservés. Le caractère "/" peut être utilisé dans HTTP pour désigner une structure hiérarchique.
J'interprète cela, au moins en ce qui concerne les URL HTTP, comme le fait que le RFC 1738 remplace le RFC 2396. Comme la requête URI n'a pas de notion de chaîne de requête, l'interprétation de reserved ne me permet pas vraiment de définir des chaînes de requête comme j'ai l'habitude de le faire maintenant.
Question
Tout a commencé lorsque j'ai voulu transmettre une liste de nombres avec la demande d'une autre ressource. Je n'y ai pas réfléchi et je l'ai simplement transmise sous forme de valeurs séparées par des virgules. À ma grande surprise, la virgule a été échappée. La requête page.html?q=1,2,3
codé transformé en page.html?q=1%2C2%2C3
ça marche, mais c'est moche et je ne m'y attendais pas. C'est alors que j'ai commencé à parcourir les RFC.
Ma première question est la suivante : est-il vraiment nécessaire d'encoder les virgules ?
Ma réponse, selon le RFC 2396 : oui, selon le RFC 1738 : non
Plus tard, j'ai trouvé des messages relatifs à la transmission de listes entre les requêtes. L'approche csv était considérée comme mauvaise. Ceci est apparu à la place (je n'ai jamais vu cela auparavant).
page.html?q=1;q=2;q=3
Ma deuxième question est la suivante : s'agit-il d'une URL valide ?
Ma réponse, selon le RFC 2396 : non, selon le RFC 1738 : non ( ; est réservé)
Je n'ai aucun problème à passer du csv tant qu'il s'agit de nombres, mais il est vrai que l'on court le risque de devoir encoder et décoder les valeurs dans les deux sens si la virgule est soudainement nécessaire pour autre chose. Quoi qu'il en soit, j'ai essayé le truc de la chaîne de requête avec point-virgule en ASP.NET et le résultat n'était pas celui que j'attendais.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
Je ne vois pas en quoi cela diffère grandement d'une approche csv, car lorsque je demande "a", j'obtiens une chaîne de caractères avec des virgules. ASP.NET n'est certainement pas une implémentation de référence, mais il ne m'a pas encore laissé tomber.
Mais surtout, et c'est ma troisième question, où se trouvent les spécifications et que feriez-vous ou ne feriez-vous pas ?