Contexte (question plus bas)
J'ai fait des recherches sur Google en lisant des RFC et des questions SO pour essayer de résoudre ce problème, mais je n'ai toujours pas de prise.
Donc je suppose que nous votons simplement pour la "meilleure" réponse et c'est tout, ou?
Fondamentalement, cela se résume à ceci.
3.4. Composant de requête
Le composant de 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 me déroute est que * uric est défini comme ceci
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Ceci est cependant quelque peu clarifié par des paragraphes tels que
La classe de syntaxe «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 URI générique; ils sont utilisés comme délimiteurs des composants décrits dans 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 réellement 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 encodage US-ASCII échappé.
Ce dernier extrait semble quelque peu en arrière, mais il indique clairement que le jeu de caractères réservé dépend du contexte. Pourtant, 3.4 déclare que tous les caractères réservés sont réservés dans un composant de requête, cependant, la seule chose qui changerait la sémantique ici est d'échapper au 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é la RFC 1738 particulièrement intéressante.
Une URL HTTP prend la forme:
http://<host>:<port>/<path>?<searchpart>
Dans les composants <chemin> et <searchpart>, "/", ";", "?" 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 que la RFC 1738 remplace la RFC 2396. Parce que la requête URI n'a aucune notion de chaîne de requête, l'interprétation de réservé ne me permet pas vraiment de définir des chaînes de requête comme je suis habitué à faire maintenant.
Question
Tout cela a commencé lorsque j'ai voulu transmettre une liste de nombres avec la demande d'une autre ressource. Je n'y ai pas beaucoup réfléchi et je l'ai juste passé sous forme de valeurs séparées par des virgules. À ma grande surprise, la virgule s'est échappée. La requête page.html?q=1,2,3
encodée en page.html?q=1%2C2%2C3
elle fonctionne, mais elle est moche et ne s'y attendait pas. C'est là que j'ai commencé à passer par les RFC.
Ma première question est simplement: est-ce que l'encodage des virgules est vraiment nécessaire?
Ma réponse, selon RFC 2396: oui, selon RFC 1738: non
Plus tard, j'ai trouvé des articles liés au passage de listes entre les demandes. Où l'approche CSV était sur le point d'être mauvaise. Cela est apparu à la place, (je n'ai jamais vu cela auparavant).
page.html?q=1;q=2;q=3
Ma deuxième question, est-ce une URL valide?
Ma réponse, selon RFC 2396: non, selon RFC 1738: non (; est réservé)
Je n'ai aucun problème avec le passage de csv tant qu'il s'agit de nombres, mais oui, vous courez le risque d'avoir à encoder et décoder des valeurs d'avant en arrière si la virgule est soudainement nécessaire pour autre chose. Quoi qu'il en soit, j'ai essayé la chaîne de requête point-virgule avec ASP.NET et le résultat n'était pas ce à quoi je m'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 avec des virgules. ASP.NET n'est certainement pas une implémentation de référence, mais cela ne m'a pas encore laissé tomber.
Mais le plus important - ma troisième question - où est la spécification pour cela? et que feriez-vous ou d'ailleurs ne pas faire?