Richtige Methode zum Übergeben mehrerer Werte für denselben Parameternamen in der GET-Anforderung


191

Ich untersuche, wie mehrere Werte für denselben Parameternamen in einer GET-Anforderung richtig übergeben werden können.

Ich habe URLs wie diese gesehen:

http://server/action?id=a&id=b

Und ich habe URLs wie diese gesehen:

http://server/action?id=a,b

Mein Verständnis ist, dass das erste richtig ist, aber ich kann keine Referenz dafür finden. Ich habe mir die http-Spezifikation angesehen, konnte aber nichts darüber sehen, wie der Abfrageteil einer URL aufgebaut sein sollte.

Ich möchte keine Antwort mit der Aufschrift "Beides ist in Ordnung". Wenn ich einen Webservice erstelle, möchte ich wissen, welche dieser Methoden Standard ist, damit Benutzer meines Webservices wissen, wie mehrere Parameter für denselben Namen übergeben werden.

Kann mich jemand auf eine offizielle Referenzquelle verweisen, um zu bestätigen, welche Option korrekt ist?

Antworten:


163

In der Tat gibt es keinen definierten Standard. Um diese Informationen zu unterstützen, werfen Sie einen Blick auf Wikipedia im Kapitel Abfragezeichenfolge . Es gibt folgenden Kommentar:

Obwohl es keinen endgültigen Standard gibt, erlauben die meisten Web-Frameworks, dass einem einzelnen Feld mehrere Werte zugeordnet werden. [3] [4]

Wenn Sie sich den RFC 3986 in Abschnitt 3.4 Abfrage ansehen , gibt es außerdem keine Definition für Parameter mit mehreren Werten.

Die meisten Anwendungen verwenden die erste Option, die Sie angezeigt haben : http://server/action?id=a&id=b. Um diese Informationen zu unterstützen, werfen Sie einen Blick auf diesen Stackoverflow-Link und diesen MSDN-Link in Bezug auf ASP.NET-Anwendungen, die denselben Standard für Parameter mit mehreren Werten verwenden.

Da Sie jedoch die APIs entwickeln, empfehle ich Ihnen, das zu tun, was für Sie am einfachsten ist, da der Aufrufer der API keine großen Probleme beim Erstellen der Abfragezeichenfolge hat.


In Ermangelung gegenteiliger Informationen haben Sie wahrscheinlich Recht - wenn RFC3986 keinen Standard spezifiziert, gibt es keinen. Danke Eduardo.
Stripybadger

18
A würde vorschlagen, id=a&id=bals boolesches UND und id=a,bals boolesches ODER zu verwenden.
Alex Skrypnyk

16
FWIW PHP unterstützt das Lesen von Argumenten wie ?id=5&id=3. PHP würde hier nur einen Wert für id einlesen. Wenn ich mich richtig erinnere, müsste es so aussehen, damit es mit PHP funktioniert:?id[]=5&id[]=3
Was haben Sie

3
+1 fürsince you are developing the APIs, I suggest you to do what is the easiest for you, since the caller of the API will not have much trouble creating the query string.
Amr

2
id=a,bgeht davon aus, dass das Koma ,ein gültiger Begrenzer ist. Ihre Parameterwerte können jedoch a enthalten ,. Dann muss der Client ,in den Abfrageparameterwerten maskieren. Aber Sie könnten entscheiden, ;ist besser. Dies bedeutet, dass Client und Server das offizielle Trennzeichen für Ihre API gemeinsam nutzen sollten. id=a&id=bhat dieses Problem nicht, obwohl es URLs länger macht
Ronan Quillevere

5

Ich würde vorschlagen, zu prüfen, wie Browser standardmäßig mit Formularen umgehen. Schauen Sie sich zum Beispiel das Formularelement an <select multiple>und wie es mit mehreren Werten aus diesem Beispiel in w3schools umgeht.

<form action="/action_page.php">
<select name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>
<input type="submit">
</form>

Für PHP verwenden:

<select name="cars[]" multiple>

Live-Beispiel von oben auf w3schools.com

Wenn Sie von oben auf "saab, opel" und dann auf "Senden" klicken, wird ein Ergebnis von cars = saab & cars = opel generiert . Dann je nach dem Back-End - Server, die Parameter Autos sollten stoßen als ein Array , dass Sie weiterverarbeiten können.

Ich hoffe, dies hilft jedem, der nach einer Standardmethode für die Behandlung dieses Problems sucht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.