Правильный способ передачи нескольких значений для одного и того же имени параметра в запросе GET
Я смотрю, как правильно передать несколько значений для одного и того же имени параметра в запросе GET.
Я видел такие URL:
http://server/action?id=a&id=b
И я видел такие URL:
http://server/action?id=a,b
Насколько я понимаю, первое правильно, но я не могу найти ссылку на это. Я взглянул на спецификацию http, но ничего не понял о том, как должна составляться часть запроса в URL.
Мне не нужен ответ, который говорит, что "либо в порядке" - если я создаю веб-сервис, я хочу знать, какой из этих методов является стандартным, чтобы люди, использующие мой веб-сервис, знали, как передавать несколько параметров для одного и того же имени.
Итак, кто-то может указать мне на официальный справочный источник, чтобы подтвердить, какой вариант является правильным?
7 ответов
Действительно, не существует определенного стандарта. Чтобы поддержать эту информацию, взгляните на википедию в главе " Строка запроса". Есть следующий комментарий:
Хотя нет определенного стандарта, большинство веб-платформ позволяют связывать несколько значений с одним полем. [3] [4]
Кроме того, когда вы посмотрите на RFC 3986, в разделе 3.4 Запрос, нет определения для параметров с несколькими значениями.
Большинство приложений используют первый вариант, который вы показали: http://server/action?id=a&id=b
, Чтобы поддержать эту информацию, взгляните на эту ссылку Stackru и эту ссылку MSDN, касающуюся приложений ASP.NET, которые используют один и тот же стандарт для параметров с несколькими значениями.
Однако, поскольку вы разрабатываете API-интерфейсы, я предлагаю вам сделать то, что проще для вас, так как вызывающий API-интерфейс не будет иметь особых проблем при создании строки запроса.
Я бы посоветовал посмотреть, как браузеры обрабатывают формы по умолчанию. Например, взгляните на элемент формы<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. Затем, в зависимости от внутреннего сервера, параметры cars должны выглядеть как массив, который вы можете обрабатывать в дальнейшем.
Надеюсь, это поможет любому, кто ищет более "стандартный" способ решения этой проблемы.
Я описываю простой метод, который очень плавно работал в Python (Django Framework).
1. При отправке запроса отправьте запрос следующим образом
http://server/action?id=a,b
2. Теперь в моем бэкэнде я разделяю полученное значение с помощью функции разделения, которая всегда создает список.
id_filter = id.split(',')
Пример: Итак, если я отправлю два значения в запросе,
http://server/action?id=a,b
тогда фильтр по данным
id_filter = ['a', 'b']
Если я отправлю только одно значение в запросе,
http://server/action?id=a
тогда результат фильтра
id_filter = ['a']
3. Чтобы отфильтровать данные, я просто использую функцию "in".
queryset = queryset.filter(model_id__in=id_filter)
который, грубо говоря, выполняет SQL-эквивалент
WHERE model_id IN ('a', 'b')
с первым запросом и,
WHERE model_id IN ('a')
со вторым запросом.
Это также будет работать с более чем двумя значениями параметров в запросе!
Мой ответ больше ориентирован на PHP.
Отправка полей формы с несколькими значениями, то есть отправка массивов, может выполняться несколькими различными способами , поскольку стандарт не обязательно оговаривается.
Три возможных способа отправки многозначных полей или массивов:
- ? cars []=Saab&cars[]=Audi (лучший способ - PHP считывает это в массив)
- ?cars=Saab&cars=Audi (Плохой вариант - PHP регистрирует только последнее значение)
- ?cars=Saab,Audi (Общий способ - вам нужно взорвать строку, чтобы получить значения в виде массива)
Например :
http: // localhost:3000 / foo?id[]= a &id[]=b
Возврат
Array
(
[id] => Array
(
[0] => a
[1] => b
)
)
(ПРИМЕЧАНИЕ: в этом случае важно присвоить ключу запроса имя some_name[], чтобы результирующие переменные запроса регистрировались PHP как массив)
Приведенные выше решения не сработали. Он просто отображал последние пары ключ / значение, но это было:
http: // localhost/?key[]=1&key[]=2
Возврат:
Array
(
[key] => Array
(
[0] => 1
[1] => 2
)
Стандарта нет, но большинство фреймворков поддерживают оба, вы можете увидеть, например, для java spring, что он принимает оба здесь
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam List<String> id) {
return "IDs are " + id;
}
И Spring MVC отобразит параметр идентификатора, разделенный запятыми:
http://localhost:8080/api/foos?id=1,2,3
----
IDs are [1,2,3]
Или список отдельных параметров id:
http://localhost:8080/api/foos?id=1&id=2
----
IDs are [1,2]
Поскольку URL-адрес является одним параметром и несколькими значениями. Очень простое решение в java - разделить строку, а затем добавить ее к себе. Например ниже: