J'ai du mal à trouver des informations faisant autorité sur le comportement des champs en double de la chaîne de requête HTTP GET, comme
http://example.com/page?field=foo&field=bar
et notamment si la commande est conservée ou non. La plupart des langages orientés Web produisent un tableau contenant à la fois foo et bar associés à un "champ" clé, mais j'aimerais savoir si une déclaration faisant autorité existe (par exemple sur une RFC) à propos de ce point. La RFC 3986 a une section 3.4. Query
, qui fait référence aux paires clé = valeur, mais rien n'est dit sur la façon d'interpréter l'ordre et de dupliquer les champs, etc. Cela a du sens, car il dépend du backend et n'est pas dans le cadre de cette RFC ...
Bien qu'une norme de facto existe, j'aimerais voir une source faisant autorité pour elle, juste par curiosité.
Réponses:
Il n'y a aucune spécification à ce sujet. Vous pouvez faire ce que vous aimez.
Les approches typiques incluent: première donnée, dernière donnée, tableau de tous, jointure de chaîne avec virgule de tout.
Supposons que la requête brute soit:
Ensuite, il existe différentes options pour ce qui
request.query['tag']
devrait rapporter, en fonction de la langue ou du cadre:la source
Je peux confirmer que pour PHP (au moins dans la version 4.4.4 et plus récente) cela fonctionne comme ceci:
résulte en:
Mais
résulte en:
Ce comportement est le même pour les données GET et POST.
la source
[]
suffixe semble être un comportement vraiment étrange, mais si vous essayez d'envoyer un tableau en tant qu'argument via jQuery.ajax()
, il les ajoutera automatiquement pour vous de la même manière. Il semble que cela profite aux utilisateurs PHP.$foo[] = 1
ajoute à un tableau. Django (Python) fait également la même chose.La réponse de yfeldblum est parfaite.
Juste une note sur un cinquième comportement que j'ai remarqué récemment: sur Windows Phone , l'ouverture d'une application avec un uri avec une clé de requête en double entraînera NavigationFailed with:
Le coupable est
System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)
.Ainsi, le système ne vous laissera même pas le gérer comme vous le souhaitez, il l'interdira. Il ne vous reste plus qu'à choisir votre propre format (CSV, JSON, XML, ...) et uri-escape-it.
la source
NavigationFailed
un tel URI. Mais, pardonnez-moi, j'ai abandonné le développement de Windows (Phone) un mois après cet article et je suis passé à macOS (iOS), donc je ne peux plus m'empêcher de suivre ce problème de nos jours.La plupart (tous?) Des frameworks n'offrent aucune garantie, alors supposons qu'ils seront retournés dans un ordre aléatoire.
Adoptez toujours l'approche la plus sûre.
Par exemple, interface java HttpServlet: ServletRequest.html # getParameterValues
Même la méthode getParameterMap laisse de côté toute mention sur l'ordre des paramètres (l'ordre d'un itérateur java.util.Map ne peut pas non plus être invoqué.)
la source
En règle générale, dupliquez les valeurs de paramètres comme
résultent en un seul paramètre queryString qui est un tableau:
J'ai vu ce comportement dans ASP, ASP.NET et PHP4.
la source
J'avais la même question. J'écris une fonction javascript pour analyser et stringifier les requêtes. Je ne sais pas si une chaîne de requête a des noms en double ou un nom avec des crochets, tels que x [] = 1 & x [] = 2, est standard bien que certaines langues prennent en charge ces formats.
Mais je trouve que Chrome et Firefox ont une nouvelle classe nommée
URLSeachParams
et qu'elle ne prend en charge que le format le plus simplename=value
. S'il y a des noms en double dans la chaîne de requête, laget
méthode deURLSearchParams
ne renvoie que le premier.Donc, personnellement, peut-être une URL de noms plus simple et sans doublons est beaucoup plus sûre pour l'avenir.
la source
URLSearchParams.getAll('x')