Jaka jest różnica między parametrami adresu URL a ciągami zapytań?

90

Nie widzę dużej różnicy między parametrami a ciągami zapytań w adresie URL. Jaka jest więc różnica i kiedy należy użyć jednego nad drugim?

Konst
źródło
1
Czy masz kontekst, ponieważ o ile wiem, te dwa są zwykle używane do tego samego - ale twój przypadek może być specyficzny dla kontekstu.
Allan S. Hansen
Nie mam konkretnego kontekstu, to ogólne pytanie. W jakim przypadku powinienem użyć jednej, a nie drugiej. Muszą istnieć różne zastosowania tych dwóch.
Konst
Osobiście - najczęściej używam parametru word, gdy o nich mówię w kontekście wywołania zmiennej lub metody, oraz ciągu zapytania, gdy mówię o nich w kontekście adresu URL. (np .: ciąg zapytania jest dzielony na parametry metody). Ale to tylko język, więc kontekst i sytuacje się różnią i wątpię, by ktokolwiek dopadł cię za używanie któregokolwiek z nich, kiedy „masz na to ochotę”.
Allan S. Hansen

Odpowiedzi:

84

Składnik zapytania jest oznaczony jako pierwszy ?w identyfikatorze URI. „Ciąg zapytania” może być synonimem (termin ten nie jest używany w standardzie URI).

Kilka przykładów identyfikatorów URI HTTP ze składnikami zapytania:

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

( lista dozwolonych znaków w składniku zapytania )

„Format” składnika zapytania zależy od autorów identyfikatora URI. Powszechną konwencją ( ale niczym więcej niż konwencją, jeśli chodzi o standard URI1) jest użycie komponentu zapytania dla par klucz-wartość, czyli inaczej. Parametry , podobnie jak w poprzednim przykładzie: bar1=a&bar2=b.

Takie parametry mogą również pojawić się w innych komponentach URI, tj. Path² i fragmencie. Jeśli chodzi o standard URI, to od Ciebie zależy, który komponent i jakiego formatu użyć.

Przykładowy identyfikator URI z parametrami w ścieżce, zapytaniu i fragmencie:

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

¹ Standard URI mówi o składniku zapytania :

[…] Komponenty zapytania są często używane do przenoszenia informacji identyfikujących w postaci par „klucz = wartość” […]

² Standard URI mówi o składniku ścieżki :

[…] Średnik („;”) i znaki równości („=”) są często używane do oddzielania parametrów i wartości parametrów mających zastosowanie do tego segmentu. Znak zastrzeżony przecinka („,”) jest często używany do podobnych celów.

unor
źródło
1
Parametry i zapytanie są różne. Zobacz sekcje 3.3 i 3.4 w tools.ietf.org/html/rfc2396.html
cowlinator
@cowlinator: (RFC 2396 jest przestarzały, ale obecny standard, RFC 3986, mówi coś podobnego o parametrach w komponencie ścieżki ). Nie powiedziałem, że są takie same, czy tak? Autorzy URI mogli określić parametry w komponencie zapytania (jak opisano w mojej odpowiedzi), a także mogli określić parametry w komponencie ścieżki (jak opisano w twoim odnośniku) - w obu przypadkach jest to tylko konwencja, nic, co standard definiuje. - Czy zasugerowałbyś zmianę mojej odpowiedzi? Czy uważasz, że OP oznaczał parametry na ścieżce?
unor
30

Parametry to pary klucz-wartość, które mogą pojawić się w ścieżce adresu URL i zaczynają się od znaku średnika ( ;).

Ciąg zapytania pojawia się po ścieżce (jeśli istnieje) i zaczyna się znakiem zapytania ( ?).

Zarówno parametry, jak i ciąg zapytania zawierają pary klucz-wartość.

W GETżądaniu parametry pojawiają się w samym adresie URL:

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

W POSTżądaniu parametry mogą pojawić się w samym adresie URL, ale także w strumieniu danych (zwanym treścią).

Ciąg zapytania jest zawsze częścią adresu URL.

Parametry mogą być ukryte w form-datastrumieniu danych podczas korzystania z metody POST, więc mogą nie pojawiać się w adresie URL. Tak, POSTżądanie może definiować parametry jako dane formularza oraz w adresie URL, i nie jest to niespójne, ponieważ parametry mogą mieć kilka wartości.

Jak dotąd nie znalazłem wytłumaczenia tego zachowania. Wydaje mi się, że czasami przydatne może być „odkrycie” parametrów z POSTżądania, a nawet pozwolenie kodowi obsługującemu GETżądanie współdzielić niektóre części z kodem obsługującym plik POST. Oczywiście może to działać tylko z kodem serwera obsługującym parametry w adresie URL.

Dopóki nie uzyskasz lepszego wglądu, sugeruję używanie parametrów tylko w form-datastrumieniu danych POSTżądań.

Źródła:

Co każdy programista powinien wiedzieć o adresach URL

RFC 3986

Laurent Caillette
źródło