Krótka odpowiedź: w żądaniach POST wartości są wysyłane w „treści” żądania. Formularze internetowe są najprawdopodobniej wysyłane z mediami typu application/x-www-form-urlencoded
lub multipart/form-data
. Języków programowania lub ram, które zostały zaprojektowane do obsługi wniosków internetowych zwykle zrobić „słuszne ™” z takimi wnioskami i zapewniają łatwy dostęp do łatwo dekodowane wartości (jak $_REQUEST
albo $_POST
w PHP, lub cgi.FieldStorage()
, flask.request.form
w Pythonie).
Teraz trochę wypisujemy, co może pomóc zrozumieć różnicę;)
Różnica pomiędzy GET
i POST
wnioski są w znacznej mierze semantyczny. Są również „używane” w różny sposób, co wyjaśnia różnicę w przekazywaniu wartości.
Podczas wykonywania GET
żądania użytkownik prosi serwer o jeden lub zestaw encji. Aby umożliwić klientowi odfiltrowanie wyniku, może użyć tak zwanego „ciągu zapytania” adresu URL. Ciąg zapytania jest częścią po ?
. Jest to część składni URI .
Tak więc, z punktu widzenia kodu aplikacji (części, która otrzymuje żądanie), konieczne będzie sprawdzenie części zapytania URI, aby uzyskać dostęp do tych wartości.
Pamiętaj, że klucze i wartości są częścią identyfikatora URI. Przeglądarki mogą nakładać ograniczenie długości identyfikatora URI. Standard HTTP stwierdza, że nie ma limitu. Ale w chwili pisania tego tekstu, większość przeglądarek nie ograniczają URI (nie mam konkretnych wartości). GET
żądania nigdy nie powinny być wykorzystywane do przesyłania nowych informacji do serwera. Zwłaszcza nie większe dokumenty. Właśnie tam powinieneś użyć POST
lub PUT
.
Podczas wykonywania POST
żądania klient faktycznie przesyła nowy dokument do zdalnego hosta. Zatem ciąg zapytania nie ma (semantycznego) sensu. Dlatego nie masz dostępu do nich w kodzie aplikacji.
POST
jest nieco bardziej skomplikowany (i znacznie bardziej elastyczny):
Po otrzymaniu żądania POST należy zawsze oczekiwać „ładunku” lub, w kategoriach HTTP: treści wiadomości . Treść wiadomości sama w sobie jest dość bezużyteczna, ponieważ nie ma standardowego formatu (o ile wiem. Może format aplikacji / octet-stream?). Format treści jest definiowany przez Content-Type
nagłówek. W przypadku użycia FORM
elementu HTML z method="POST"
jest to zwykle application/x-www-form-urlencoded
. Innym bardzo popularnym typem jest wieloczęściowy / formularz-dane, jeśli używasz przesyłania plików. Ale może to być wszystko , od text/plain
, ponad, application/json
a nawet zwyczaj application/octet-stream
.
W każdym przypadku, jeśli zostanie POST
wysłane żądanie, Content-Type
którego aplikacja nie może obsłużyć, powinno zwrócić 415
kod stanu .
Większość języków programowania (i / lub Web-ram) oferują sposób na DE / zakodować treść wiadomości do / z najczęstszych typów (jak application/x-www-form-urlencoded
, multipart/form-data
lub application/json
). To takie proste. Typy niestandardowe wymagają potencjalnie nieco więcej pracy.
Korzystając ze standardowego dokumentu zakodowanego w formularzu HTML jako przykładu, aplikacja powinna wykonać następujące kroki:
- Przeczytaj
Content-Type
pole
- Jeśli wartość nie jest jednym z obsługiwanych typów nośników, zwróć odpowiedź z
415
kodem stanu
- w przeciwnym razie zdekoduj wartości z treści wiadomości.
Znowu języki takie jak PHP lub frameworki dla innych popularnych języków prawdopodobnie to zapewnią. Wyjątkiem jest 415
błąd. Żadna struktura nie jest w stanie przewidzieć, jakie typy treści wybiera aplikacja do obsługi i / lub nie. To zależy od Ciebie.
PUT
Wniosek jest dość dużo traktowane w dokładnie taki sam sposób, jak POST
żądanie. Duża różnica polega na tym, że POST
żądanie ma pozwolić serwerowi zdecydować, w jaki sposób (a jeśli w ogóle) stworzyć nowy zasób. Historycznie (z przestarzałego RFC2616 było tworzenie nowego zasobu jako „podrzędny” (potomek) identyfikatora URI, do którego wysłano żądanie).
Natomiast PUT
żądanie ma „zdeponować” zasób dokładnie pod tym identyfikatorem URI i dokładnie z tą zawartością. Nie więcej nie mniej. Chodzi o to, że klient jest odpowiedzialny za wytworzenie całego zasobu przed jego „umieszczeniem”. Serwer powinien zaakceptować to, co jest na danym adresie URL.
W rezultacie POST
żądanie zwykle nie jest używane do zastąpienia istniejącego zasobu. PUT
Żądanie może zrobić zarówno tworzyć i wymieniać.
Dygresja
Istnieją również „ parametry ścieżki ”, których można użyć do przesłania dodatkowych danych do pilota, ale są one tak rzadkie, że nie będę tu wchodził w szczegóły. Ale, dla odniesienia, oto fragment RFC:
Oprócz segmentów kropek w ścieżkach hierarchicznych, segment ścieżki jest uważany za nieprzezroczysty przez ogólną składnię. Aplikacje wytwarzające identyfikatory URI często używają znaków zastrzeżonych dozwolonych w segmencie, aby rozgraniczać podskładniki specyficzne dla schematu lub specyficzne dla procedury obsługi odniesienia. Na przykład znaki zastrzeżone średnika („;”) i równe („=”) są często używane do rozgraniczenia parametrów i wartości parametrów mających zastosowanie do tego segmentu. Znak podobny do przecinka („,”) jest często używany do podobnych celów. Na przykład jeden producent URI może użyć segmentu takiego jak „nazwa; v = 1.1”, aby wskazać odniesienie do wersji 1.1 „nazwa”, podczas gdy inny może użyć segmentu takiego jak „nazwa, 1.1”, aby wskazać to samo. Typy parametrów mogą być definiowane przez semantykę specyficzną dla schematu,
multipart/form-data
. Dla zainteresowanych, oto pytanie na ten temat .