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-urlencodedlub 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 $_REQUESTalbo $_POSTw PHP, lub cgi.FieldStorage(), flask.request.formw Pythonie).
Teraz trochę wypisujemy, co może pomóc zrozumieć różnicę;)
Różnica pomiędzy GETi POSTwnioski 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ć POSTlub 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.
POSTjest 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-Typenagłówek. W przypadku użycia FORMelementu 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/jsona nawet zwyczaj application/octet-stream.
W każdym przypadku, jeśli zostanie POSTwysłane żądanie, Content-Typektórego aplikacja nie może obsłużyć, powinno zwrócić 415kod 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-datalub 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-Typepole
- Jeśli wartość nie jest jednym z obsługiwanych typów nośników, zwróć odpowiedź z
415kodem 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 415błą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.
PUTWniosek 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 .