W żądaniu HTTP GET parametry są wysyłane jako ciąg zapytania :
http://example.com/page ? parametr = wartość, a także = inny
W żądaniu HTTP POST parametry nie są wysyłane wraz z identyfikatorem URI.
Gdzie są wartości? W nagłówku żądania? W treści wniosku? Jak to wygląda?
multipart/form-data
. Dla zainteresowanych, oto pytanie na ten temat .multipart/form-data
lub, jeśli jesteś odpowiedzialny za budowę żądania, zmień typ zawartości naapplication/json
i wklej bezpośrednio tekst json w treści httpTreść jest umieszczana za nagłówkami HTTP. Format HTTP POST ma mieć nagłówki HTTP, po których następuje pusty wiersz, a następnie treść żądania. Zmienne POST są przechowywane w ciele jako pary klucz-wartość.
Możesz to zobaczyć w surowej treści postu HTTP, pokazanej poniżej:
Możesz to zobaczyć za pomocą narzędzia takiego jak Fiddler , którego możesz użyć do oglądania surowego żądania HTTP i ładunków odpowiedzi przesyłanych przez sieć.
źródło
application/x-www-form-urlencoded
, co nie zawsze ma miejsce.From
tam nagłówek?From
nagłówka. IMO jest tam z kodem statusu 418 HTTP.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
lubmultipart/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, lubcgi.FieldStorage()
,flask.request.form
w Pythonie).Teraz trochę wypisujemy, co może pomóc zrozumieć różnicę;)
Różnica pomiędzy
GET
iPOST
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.GET ( odpowiednia sekcja RFC )
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
lubPUT
.POST ( odpowiednia sekcja RFC )
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życiaFORM
elementu HTML zmethod="POST"
jest to zwykleapplication/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 , odtext/plain
, ponad,application/json
a nawet zwyczajapplication/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
lubapplication/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:
Content-Type
pole415
kodem stanuZnowu 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 ( odpowiednia sekcja RFC )
PUT
Wniosek jest dość dużo traktowane w dokładnie taki sam sposób, jakPOST
żądanie. Duża różnica polega na tym, żePOST
żą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:
źródło
PUT
sekcji, zobaczysz, że jest idempotentny.POST
przeciwnie - z definicji nie może być.POST
zawsze utworzy nowy zasób.PUT
będzie, jeśli istnieje identyczny zasób, zastąpi go. Więc jeśli zadzwoniszPOST
10 razy, stworzysz 10 zasobów. Jeśli zadzwoniszPUT
10 razy, utworzy (może) tylko jeden. Czy to jest odpowiedź na Twoje pytanie?Nie możesz wpisać go bezpośrednio na pasku adresu URL przeglądarki.
Możesz zobaczyć, jak dane POST są wysyłane przez Internet, na przykład za pomocą nagłówków Live HTTP . Wynik będzie taki
Gdzie to mówi
będą wartościami postu.
źródło
Content-Length
ma29
tu być ? To jest rzeczywista długość łańcuchausername=zurfyx&pass=password
.Domyślny typ nośnika w żądaniu POST to
application/x-www-form-urlencoded
. Jest to format kodowania par klucz-wartość. Klucze mogą być duplikowane. Każda para klucz-wartość jest oddzielona&
znakiem, a każdy klucz jest oddzielony od swojej wartości=
znakiem.Na przykład:
Jest zakodowany jako:
Jest to umieszczane w treści żądania za nagłówkami HTTP.
źródło
Wartości formularzy w POST HTTP są wysyłane w treści żądania, w tym samym formacie co kwerenda.
Aby uzyskać więcej informacji, zobacz specyfikację .
źródło
?
na przykład?application/x-www-form-urlencoded
, co nie zawsze ma miejsce.Niektóre usługi internetowe wymagają oddzielnego umieszczania danych żądania i metadanych . Na przykład funkcja zdalna może oczekiwać, że podpisany ciąg metadanych jest zawarty w identyfikatorze URI, podczas gdy dane są publikowane w treści HTTP.
Żądanie POST może semantycznie wyglądać następująco:
Podejście to logicznie łączy QueryString i Body-Post za pomocą jednego,
Content-Type
który jest „instrukcją parsowania” dla serwera WWW.Uwaga: HTTP / 1.1 jest owinięty z
#32
(spacja) na lewo i#10
(Line Feed) po prawej stronie.źródło
/user/john
i/?user=john
jest jedynie semantyczna (HTTP tak naprawdę nie traktuje specjalnych ciągów zapytań), więc uważam to za uzasadnione. Ale co rozumiesz przez „owinięty spacją po lewej stronie”? Nie ma spacji przed metodą HTTP. Masz na myśli pustą linię na treść postu?...Ym04
iHTTP/1.1
w powyższym kodzie. Zatem QueryString po prostu znajduje się między czasownikiem a wersją protokołu.?
podobny doGET
żądania.Po pierwsze, rozróżnijmy między
GET
iPOST
Pobierz: Jest to domyślne
HTTP
żądanie wysyłane do serwera, które służy do pobierania danych z serwera, a ciąg zapytania, który pojawia się po?
w,URI
służy do pobierania unikalnego zasobu.to jest format
tutaj
data=value
przekazano wartość ciągu zapytania.POST: Służy do bezpiecznego przesyłania danych do serwera, więc wszystko, co jest potrzebne, jest to format
POST
żądaniaDlaczego POST zamiast GET?
Ponieważ
GET
wartość wysyłana do serwerów jest zwykle dołączana do podstawowego adresu URL w ciągu zapytania, teraz występują 2 tego konsekwencjeGET
wnioski są zapisywane w historii przeglądarki z parametrami. Twoje hasła pozostają więc niezaszyfrowane w historii przeglądarki. To był prawdziwy problem dla Facebooka w tamtych czasach.URI
. Jeśli wysłano zbyt wiele parametrów, możesz otrzymać414 Error - URI too long
W przypadku żądania wysłania dane z pól są dodawane do treści. Długość parametrów żądania jest obliczana i dodawana do nagłówka dla długości treści, a żadne ważne dane nie są dołączane bezpośrednio do adresu URL.
Możesz użyć sekcji sieci Narzędzi Google dla programistów, aby wyświetlić podstawowe informacje na temat wysyłania żądań do serwerów.
i zawsze można dodać więcej wartości w
Request Headers
LikeCache-Control
,Origin
,Accept
.źródło
HTTPS
połączenia, a nieHTTP
.HTTPS
szyfruje zarównoURL
(w tym parametry zapytania), jak iRequest Body
, gdyHTTP
szyfruje / nie chroni. Opisany problem wynika z faktu, że wiele przeglądarek przechowujeURIs
(w tymURLs
) w swoich historycznych bazach danych (zwykle niezaszyfrowanych). Dlatego używaj tylkoRequest Body
+HTTPS
do czegokolwiek wrażliwego.