Использование повторяющихся параметров в URL-адресе

Мы создаем API внутри компании и часто передаем параметр с несколькими значениями.

Они используют: mysite.com?id=1&id=2&id=3

Вместо: mysite.com?id=1,2,3

Я одобряю второй подход, но мне было любопытно, было ли на самом деле неправильно делать первый?

Ответ 1

Я не гуру HTTP, но из того, что я понимаю, нет четкого стандарта в части запроса URL-адреса относительно нескольких значений, обычно это зависит от CGI, который обрабатывает запрос для синтаксического анализа строки запроса.

RFC 1738 в разделе 3.3 упоминается a searchpart и что он должен идти после ?, но, похоже, не описывает его формат.

http://<host>:<port>/<path>?<searchpart>

Ответ 2

Я не (потрудился) проверить, какой стандарт RFC определяет. (Любой, кто знает об этом, оставьте ссылку в комментарии.) Но на практике способ mysite.com?id=1&id=2&id=3 уже является тем, как браузер будет создавать, когда форма содержит дублированные поля, как правило, флажки. Смотрите это в действии на странице w3schools. Таким образом, есть хороший шанс, что любой язык программирования, который вы используете, уже предоставляет некоторые вспомогательные функции для синтаксического анализа такого ввода и, вероятно, возвращает список.

Вы могли бы, конечно, пойти своим собственным подходом, таким как mysite.com?id=1,2,3, что совсем не плохо в этом конкретном случае. Но вам нужно будет реализовать свою собственную логику для производства и потребления такого формата. Теперь вам может понадобиться или не нужно думать о том, чтобы обрабатывать некоторые угловые случаи самостоятельно, например: что, если вход не правильно сформирован, например mysite.com?id=1,2,? И вам нужно изобрести еще один разделитель, если сам знак запятой также может быть допустимым входом, например mysite.com?name=Doe,John|Doe,Jane? Вы достигнете точки, в которой вы будете использовать json-строку в качестве значения, например mysite.com?name=["John Doe", "Jane Doe"]? и т.д. и т.д. Ваш пробег может отличаться.

Ответ 3

в вашем первом подходе вы получите массив значений querystring, но во втором подходе вы получите строку значений querystring.