Правильный способ передачи нескольких значений для одного имени параметра в запросе GET

Я изучаю, как правильно передать несколько значений для одного и того же имени параметра в запросе GET.

Я видел такие URL-адреса:

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

И я видел такие URL-адреса:

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

Я понимаю, что первое правильно, но я не могу найти никакой ссылки для этого. Я просмотрел спецификацию http, но ничего не мог понять о том, как должна быть составлена ​​часть запроса "URL-адрес".

Мне не нужен ответ, в котором говорится, что "все в порядке" - если я создаю веб-сервис, я хочу знать, какой из этих методов является стандартным, чтобы люди, использующие мой веб-сервис, знали, как передавать несколько параметров для то же имя.

Итак, может кто-нибудь указать мне на официальный источник ссылки, чтобы подтвердить, какой вариант правильный?

Ответ 1

Действительно, нет определенного стандарта. Чтобы поддержать эту информацию, посмотрите на wikipedia в главе Query String. Существует следующий комментарий:

Пока нет окончательного стандарта, большинство веб-фреймворков позволяют несколько значений, которые должны быть связаны с одним полем. [3] [4]

Кроме того, когда вы смотрите RFC 3986, в разделе 3.4 Query, определение параметров с несколькими значениями отсутствует.

Большинство приложений используют первый вариант, который вы указали: http://server/action?id=a&id=b. Чтобы поддержать эту информацию, ознакомьтесь с этой fooobar.com/questions/14693/... и этой

Ответ 2

Я бы предложил посмотреть, как браузеры обрабатывают формы по умолчанию. Например, посмотрите на элемент формы <select multiple> и как он обрабатывает несколько значений из этого примера в w3schools.

<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>

Для использования PHP:

<select name="cars[]" multiple>

Живой пример сверху на w3schools.com

Сверху, если вы нажмете "saab, opel" и нажмете "отправить", будет получен результат cars = saab & cars = opel. Затем в зависимости от фонового сервера, параметр машина должна натолкнуться как массив, который можно дополнительно обработать.

Надеюсь, что это поможет любому, кто ищет более "стандартный" способ решения этой проблемы.

Ответ 3

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


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