У чому різниця між параметрами URL та рядками запитів?


91

Я не бачу великої різниці між параметрами та рядками запитів у URL-адресі. То в чому різниця і коли один слід використовувати над іншим?


1
Чи є у вас контекст, тому що, наскільки мені відомо, ці два способи зазвичай використовуються для одного і того ж, але ваш випадок може бути конкретним.
Allan S. Hansen

У мене немає конкретного контексту, це загальне питання. У якому випадку мені слід використовувати один спосіб замість іншого. Ці два способи повинні застосовуватися по-різному.
Konst

Особисто я переважно використовую параметр word, коли приймаю їх у контексті виклику змінної або методу, і рядок запиту, коли розмовляю про них у контексті 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, тобто path² та фрагменті. Що стосується стандарту URI, то від вас залежить, який компонент і який формат використовувати.

Приклад URI з параметрами у шляху, запиті та фрагменті:

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

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

[…] Компоненти запиту часто використовуються для передачі ідентифікаційної інформації у вигляді пар "ключ = значення" […]

² Стандарт URI говорить про компонент шляху :

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


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запит, поділяти деякі частини з кодом, що обробляє a POST. Звичайно, це може працювати лише з кодом сервера, що підтримує параметри в URL-адресі.

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

Джерела:

Що кожен розробник повинен знати про URL-адреси

RFC 3986

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.