Ich habe Probleme beim Auffinden autorisierender Informationen zum Verhalten mit doppelten Feldern für HTTP-GET-Abfragezeichenfolgen, z
http://example.com/page?field=foo&field=bar
und insbesondere, ob die Bestellung eingehalten wird oder nicht. Die meisten weborientierten Sprachen erzeugen ein Array, das sowohl foo als auch bar enthält, die einem Schlüsselfeld zugeordnet sind. Ich würde jedoch gerne wissen, ob zu diesem Punkt eine maßgebliche Aussage (z. B. in einem RFC) vorhanden ist. RFC 3986 hat einen Abschnitt 3.4. Query
, der sich auf Schlüssel = Wert-Paare bezieht, aber es wird nichts darüber gesagt, wie Reihenfolge und doppelte Felder zu interpretieren sind und so weiter. Dies ist sinnvoll, da es vom Backend abhängig ist und nicht im Rahmen dieses RFC liegt ...
Obwohl es einen De-facto-Standard gibt, würde ich aus Neugier gerne eine maßgebliche Quelle dafür sehen.
Antworten:
Es gibt keine Spezifikation dazu. Sie können tun, was Sie wollen.
Typische Ansätze sind: zuerst gegeben, zuletzt gegeben, Array von allen, String-Join mit Komma von allen.
Angenommen, die Rohanforderung lautet:
Dann gibt es verschiedene Optionen für das, was
request.query['tag']
je nach Sprache oder Rahmen ergeben soll:quelle
Ich kann bestätigen, dass es für PHP (zumindest in Version 4.4.4 und neuer) folgendermaßen funktioniert:
Ergebnisse in:
Aber
Ergebnisse in:
Dieses Verhalten ist für GET- und POST-Daten gleich.
quelle
[]
Suffix scheint ein wirklich seltsames Verhalten zu sein. Wenn Sie jedoch versuchen, ein Array als Argument über jQuery's zu senden.ajax()
, werden diese automatisch auf dieselbe Weise für Sie hinzugefügt. Es sieht so aus, als ob dies den PHP-Benutzern zugute kommt.$foo[] = 1
es an ein Array angehängt. Django (Python) macht das auch.yfeldblums Antwort ist perfekt.
Nur ein Hinweis zu einem fünften Verhalten, das ich kürzlich bemerkt habe: Unter Windows Phone führt das Öffnen einer Anwendung mit einer URL mit einem doppelten Abfrageschlüssel zu NavigationFailed mit:
Der Schuldige ist
System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)
.Das System lässt Sie also nicht einmal so damit umgehen, wie Sie es möchten, es verbietet es. Sie haben nur noch die einzige Lösung, um Ihr eigenes Format (CSV, JSON, XML, ...) und Uri-Escape-It auszuwählen.
quelle
NavigationFailed
nach einer solchen URI. Aber verzeihen Sie mir, ich habe die Windows (Phone) -Entwicklung einen Monat nach diesem Beitrag eingestellt und bin zu macOS (iOS) gewechselt, sodass ich heutzutage nicht mehr anders kann, um dieses Problem zu verfolgen.Die meisten (alle?) Frameworks bieten keine Garantien. Nehmen Sie also an, dass sie in zufälliger Reihenfolge zurückgegeben werden.
Gehen Sie immer am sichersten vor.
Beispiel: Java-HttpServlet-Schnittstelle: ServletRequest.html # getParameterValues
Selbst die Methode getParameterMap lässt keine Erwähnung der Parameterreihenfolge aus (auf die Reihenfolge eines Iterators java.util.Map kann man sich auch nicht verlassen.)
quelle
In der Regel duplizieren Parameterwerte wie
führen zu einem einzelnen queryString-Parameter, der ein Array ist:
Ich habe dieses Verhalten in ASP, ASP.NET und PHP4 gesehen.
quelle
Ich hatte die gleiche Frage. Ich schreibe eine Javascript-Funktion, um Abfragen zu analysieren und zu stringifizieren. Ich weiß nicht, ob eine Abfragezeichenfolge doppelte Namen oder Namen in Klammern enthält, z. B. x [] = 1 & x [] = 2, obwohl einige Sprachen dieses Format unterstützen.
Aber ich finde, dass Chrome und Firefox eine neue Klasse namens haben
URLSeachParams
und es nur das einfachste Format als unterstütztname=value
. Wenn die Abfragezeichenfolge doppelte Namen enthält, gibt dieget
MethodeURLSearchParams
nur den ersten zurück.Persönlich ist eine einfachste und keine doppelte Namens-URL für die Zukunft viel sicherer.
quelle
URLSearchParams.getAll('x')