В чем разница между параметрами URL-адреса и строками запроса?

91

Я не вижу большой разницы между параметрами и строками запроса в URL-адресе. Так в чем же разница и когда следует использовать одно вместо другого?

Конст
источник
1
У вас есть контекст, потому что, насколько я знаю, они обычно используются для одного и того же, но ваш случай может зависеть от контекста.
Аллан С. Хансен
У меня нет конкретного контекста, это общий вопрос. В каком случае я должен использовать один способ вместо другого. Эти два понятия должны использоваться по-разному.
Конст
Лично я в основном использую слово параметр, когда говорю о них в контексте вызова переменной или метода, и строку запроса, когда говорю о них в контексте URL. (например: строка запроса разбивается на параметры для метода). Но это всего лишь язык, поэтому контекст и ситуации различаются, и я сомневаюсь, что кто-нибудь станет охотиться на вас за использование любого из них, когда вам это нравится :).
Аллан С. Хансен

Ответы:

84

Компонент запроса обозначается первым ?в URI. «Строка запроса» может быть синонимом (этот термин не используется в стандарте URI).

Некоторые примеры для HTTP URI с компонентами запроса:

http://example.com/foo?bar
http://example.com/foo/foo/foo?bar/bar/bar
http://example.com/?bar
http://example.com/?@bar._=???/1:
http://example.com/?bar1=a&bar2=b

( список разрешенных символов в компоненте запроса )

«Формат» компонента запроса зависит от авторов URI. Распространенным соглашением ( но не более чем соглашением, насколько это касается стандарта URI ¹) является использование компонента запроса для пар ключ-значение, иначе. параметры , как в последнем примере: bar1=a&bar2=b.

Такие параметры также могут появляться в других компонентах URI, то есть в пути² и фрагменте. Что касается стандарта URI, вам решать, какой компонент и какой формат использовать.

Пример URI с параметрами в пути, запросе и фрагменте:

http://example.com/foo;key1=value1?key2=value2#key3=value3

¹ Стандарт URI говорит о компоненте запроса :

[…] Компоненты запроса часто используются для передачи идентифицирующей информации в виде пар «ключ = значение» […]

² Стандарт URI говорит о компоненте пути :

[…] Зарезервированные символы точки с запятой (";") и равенства ("=") часто используются для разделения параметров и значений параметров, применимых к этому сегменту. Зарезервированный символ запятой (",") часто используется для аналогичных целей.

unor
источник
1
Параметр и запрос разные. См. Разделы 3.3 и 3.4 в tools.ietf.org/html/rfc2396.html
cowlinator
@cowlinator: (RFC 2396 устарел, но текущий стандарт RFC 3986 говорит нечто подобное о параметрах в компоненте пути ). Я не утверждал, что они такие же, или я? Авторы URI могут указывать параметры в компоненте запроса (как описано в моем ответе), а также они могут указывать параметры в компоненте пути (как описано в вашей справке) - в обоих случаях это просто соглашение, ничего из того, что определяет стандарт. - Не могли бы вы предложить изменить мой ответ? Как вы думаете, OP имел в виду параметры в пути?
unor
30

Параметры - это пары "ключ-значение", которые могут появляться внутри URL-адреса и начинаться с точки с запятой ( ;).

Строка запроса появляется после пути (если есть) и начинается с вопросительного знака (? ).

И параметры, и строка запроса содержат пары ключ-значение.

В GETзапросе параметры появляются в самом URL:

<scheme>://<username>:<password>@<host>:<port>/<path>;<parameters>?<query>#<fragment>

В POST запросе параметры могут появляться в самом URL-адресе, а также в потоке данных (так называемом контенте).

Строка запроса всегда является частью URL-адреса.

Параметры могут быть form-dataскрыты в потоке данных при использовании метода POST, поэтому они могут не отображаться в URL-адресе. Да, POSTзапрос может определять параметры как данные формы и в URL-адресе, и это не противоречит, потому что параметры могут иметь несколько значений.

Я пока не нашел объяснения такому поведению. Я предполагаю, что иногда может быть полезно «показать» параметры из POSTзапроса или даже позволить коду, обрабатывающему GETзапрос, делиться некоторыми частями с кодом, обрабатывающимPOST . Конечно, это может работать только с параметрами поддержки кода сервера в URL-адресе.

Пока вы не получите лучшего понимания, я предлагаю вам использовать параметры только в form-dataпотоке данных POSTзапросов.

Источники:

Что каждый разработчик должен знать об URL-адресах

RFC 3986

Лоран Кайетт
источник