Правильный способ передачи нескольких значений для одного и того же имени параметра в запросе 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 - разделить строку, а затем добавить ее к себе. Например ниже:

Другие вопросы по тегам