2014-06-05 4 views
83

Ich untersuche, wie mehrere Werte für den gleichen Parameternamen in einer GET-Anforderung korrekt übergeben werden.Korrekter Weg, mehrere Werte für denselben Parameternamen in der GET-Anforderung zu übergeben

Ich habe so gesehen URLs:

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

Und ich habe URLs so gesehen:

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

Mein Verständnis ist, dass die erste richtig ist, aber ich kann nicht finden irgendeine Referenz dafür. Ich habe mir die HTTP-Spezifikation angeschaut, konnte aber nichts darüber herausfinden, wie der "Abfrage" -Teil einer URL aussehen sollte.

Ich möchte keine Antwort, die sagt "entweder ist in Ordnung" - wenn ich einen Webservice erstelle, möchte ich wissen, welche dieser Methoden Standard ist, so dass Leute, die meinen Webservice verwenden, mehrere Parameter übergeben können der selbe Name.

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

Antwort

76

In der Tat gibt es keinen definierten Standard. Um diese Informationen zu unterstützen, schauen Sie sich Wikipedia im Kapitel Query String an. Es gibt den folgenden Kommentar:

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

Außerdem, wenn Sie am RFC 3986 einen Blick darauf werfen, in Abschnitt 3.4 Query, gibt es 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 diese Stackoverflow link und diese MSDN link in Bezug auf ASP.NET-Anwendungen, die den gleichen 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 haben wird.

+0

In Ermangelung von Informationen, im Gegenteil, ich denke, du hast recht - wenn RFC3986 einen Standard spezifiziert nicht, dann gibt es keinen. Danke Eduardo. – stripybadger

+2

A würde vorschlagen, 'id = a & id = b' als boolesches AND und 'id = a, b' als boolesches ODER zu verwenden. –

+9

FWIW PHP unterstützt das Lesen von Argumenten wie '? Id = 5 & id = 3' nicht. PHP würde hier nur einen Wert für ID lesen. Wenn ich mich richtig erinnere, müsste es so aussehen, damit es mit PHP funktioniert: '? Id [] = 5 & id [] = 3' –

-8

var v1 = getParameterByName('resultTerm1'); 
 
\t var v2 = getparamNameMultiValues('resultTerm2'); 
 

 

 
    function getParameterByName(name, url) { 
 
\t  if (!url) url = window.location.href; 
 
\t  name = name.replace(/[\[\]]/g, "\\$&"); 
 
\t  var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), 
 
\t   results = regex.exec(url); 
 
\t  if (!results) return null; 
 
\t  if (!results[2]) return ''; 
 
\t  return decodeURIComponent(results[2].replace(/\+/g, " ")); 
 
\t } 
 
\t 
 
\t function getparamNameMultiValues(paramName){ 
 
\t  var sURL = window.document.URL.toString(); 
 
\t  var value =[]; 
 
\t  if (sURL.indexOf("?") > 0){ 
 
\t   var arrParams = sURL.split("?"); 
 
\t   var arrURLParams = arrParams[1].split("&"); 
 
\t   for (var i = 0; i<arrURLParams.length; i++){ 
 
\t    var sParam = arrURLParams[i].split("="); 
 
\t    console.log(sParam); 
 
\t    if(sParam){ 
 
\t \t    if(sParam[0] == paramName){ 
 
\t \t    \t if(sParam.length>0){ 
 
\t \t    \t \t value.push(sParam[1].trim()); 
 
\t \t    \t } 
 
\t \t    } 
 
\t    } 
 
\t   } 
 
\t  } 
 
\t  return value.toString(); 
 
\t }

+9

Bitte geben Sie keine reinen Code-Antworten ein.Versuchen Sie vielmehr zu erklären, was Ihr Code macht und warum er das ursprüngliche Problem lösen wird. – user1438038

+0

jetzt, wie ist das überhaupt im Zusammenhang mit der Frage? Hat dich jemand gebeten, CODE zu schreiben? Ich sehe keine solche Anfrage, Sie sollten die Frage richtig lesen, bevor Sie antworten. – vasilevich

Verwandte Themen