Jak parametry są wysyłane w żądaniu HTTP POST?
W żądaniu HTTPGET , parametry są wysyłane jako ciąg zapytania:
http://example.com/page?parameter=value&also=another
W żądaniu HTTP POST parametry NIE są wysyłane wraz z URI.
Gdzie są wartości? w nagłówku żądania? W treści wniosku? A na co to wygląda?
8 answers
Wartości są wysyłane w treści żądania, w formacie określonym przez typ zawartości.
Zazwyczaj typem zawartości jest application/x-www-form-urlencoded
, więc ciało żądania używa tego samego formatu co ciąg zapytania:
parameter=value&also=another
Gdy używasz przesłanego pliku w formularzu, zamiast tego używasz kodowania multipart/form-data
, które ma inny format. To bardziej skomplikowane, ale zazwyczaj nie musisz się przejmować tym, jak to wygląda, więc nie będę pokazywał przykładu, ale dobrze jest wiedzieć, że istnieje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-06 01:05:15
Zawartość jest umieszczana po nagłówkach HTTP. Format postu HTTP ma zawierać nagłówki HTTP, po których następuje pusta linia, a po niej treść żądania. Zmienne POST są przechowywane jako pary klucz-wartość w ciele.
Możesz to zobaczyć w surowej treści postu HTTP, pokazanego poniżej:
POST /path/script.cgi HTTP/1.0
From: [email protected]
User-Agent: HTTPTool/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
home=Cosby&favorite+flavor=flies
Możesz to zobaczyć za pomocą narzędzia takiego jak Fiddler , którego możesz użyć do oglądania nieprzetworzonych żądań HTTP i odpowiedzi wysyłanych przez przewód.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-27 19:26:54
Krótka odpowiedź: w żądaniach POST wartości są wysyłane w "treści" żądania. W przypadku formularzy internetowych są one najprawdopodobniej wysyłane z nośnikiem typu application/x-www-form-urlencoded
lub multipart/form-data
. Języki programowania lub frameworki, które zostały zaprojektowane do obsługi żądań internetowych, zazwyczaj robią "The Right Thing™" z takimi żądaniami i zapewniają łatwy dostęp do łatwo dekodowanych wartości (jak $_REQUEST
lub $_POST
w PHP, lub cgi.FieldStorage()
, flask.request.form
w Pythonie).
Teraz trochę dygresji, co może pomóc zrozumieć różnicę;)
Różnica między żądaniami GET
i POST
jest w dużej mierze semantyczna. Są one również" używane " inaczej, co wyjaśnia różnicę w przekazywaniu wartości.
GET (odpowiednia sekcja RFC)
Wykonując żądanie GET
, prosisz serwer o jeden lub zestaw encji. Aby klient mógł filtrować wynik, może użyć tzw. "ciągu zapytań" adresu URL. Ciąg zapytania jest częścią po ?
. To jest część składni URI .
Tak więc, z punktu widzenia kodu aplikacji (części, która otrzymuje żądanie), będziesz musiał sprawdzić część zapytania URI, aby uzyskać dostęp do tych wartości.
Zwróć uwagę, że klucze i wartości są częścią URI. Przeglądarki mogą nałożyć ograniczenie długości URI. Standard HTTP stwierdza, że nie ma limitu. Ale w momencie pisania tego tekstu, większość przeglądarek do ograniczyć URI (nie mam konkretnego wartości). GET
żądania nie powinny nigdy być używane do przesyłania nowych informacji do serwera. Zwłaszcza nie większe dokumenty. Tam należy użyć POST
lub PUT
.
POST ( odpowiednia sekcja RFC )
Podczas wykonywania POST
żądania, klient rzeczywiście wysyła nowy dokument do zdalnego hosta. Tak więc, zapytanie łańcuch znaków nie ma (semantycznie) sensu. Dlatego nie masz do nich dostępu w aplikacji kod.
POST
jest nieco bardziej złożony (i sposób bardziej elastyczny):
Podczas odbierania żądania POST, należy zawsze oczekiwać "ładunku", lub, w terminach HTTP: treść wiadomości . Treść wiadomości sama w sobie jest dość bezużyteczna, ponieważ nie ma standardu (o ile mogę powiedzieć. Może application / octet-stream?) format. Format body jest zdefiniowany przez nagłówek Content-Type
. W przypadku użycia elementu HTML FORM
z method="POST"
, zwykle jest to application/x-www-form-urlencoded
. Kolejny bardzo często spotykanym typem jest multipart / form-data jeśli używasz przesyłania plików. Ale może to być cokolwiek, począwszy od text/plain
, przez application/json
lub nawet zwyczaj application/octet-stream
.
W każdym przypadku, jeśli POST
wniosek jest złożony z Content-Type
, które nie mogą być obsługiwane przez aplikację, powinien zwrócić 415
status-kod .
Większość języków programowania (i / lub web-frameworków) oferuje sposób na de / kodowanie treści wiadomości z/do najpopularniejszych typów (takich jakapplication/x-www-form-urlencoded
, multipart/form-data
lub application/json
). To proste. Niestandardowe typy wymagają potencjalnie nieco więcej pracy.
Używając standardowego dokumentu zakodowanego w formie HTML jako przykładu, aplikacja powinna wykonać następujące kroki:
- przeczytaj pole
Content-Type
- jeśli wartość nie jest jednym z obsługiwanych typów nośników, zwróć odpowiedź z kodem statusu
415
- w przeciwnym razie odszyfruj wartości z treści wiadomości.
Znowu języki takie jak PHP, czy web-frameworki dla innych popularnych języki prawdopodobnie zajmą się tym za Ciebie. Wyjątkiem od tego jest błąd 415
. Żaden framework nie może przewidzieć, które typy treści aplikacja zdecyduje się wspierać i / lub nie wspierać. To zależy od Ciebie.
PUT ( odpowiednia sekcja RFC )
A PUT
żądanie jest w zasadzie traktowane w taki sam sposób jak POST
żądanie. Duża różnica polega na tym, że żądanie POST
ma pozwolić serwerowi zdecydować, jak (i czy w ogóle) utworzyć nowy zasób. Historycznie (z przestarzałego już RFC2616 było stworzenie nowego zasobu jako "podrzędnego" (potomka) URI, do którego wysłano żądanie).
W konsekwencji, żądanie POST
zwykle nie jest używane do zastąpienia istniejącego zasobu. Żądanie PUT
może zarówno utworzyć , jak i zastąpić .
Side-Note
Istnieją również " parametry ścieżki ", które mogą być użyte do wysyłania dodatkowych danych do pilota, ale są one tak rzadkie, że nie będę wchodzić w zbyt wiele szczegółów tutaj. Ale, dla odniesienia, tutaj jest fragment z RFC:
Oprócz dot-segmentów w ścieżek hierarchicznych, segment ścieżki jest rozpatrywany nieprzezroczyste przez składnię generyczną. Uri produkujące aplikacje często korzystają z zastrzeżone znaki dozwolone w segmencie do rozgraniczania specyficznych dla danego schematu lub dereference - komponenty specyficzne dla obsługi. Na przykład średnik (";") i równe ( " = " ) znaki Zastrzeżone są często używane do rozgraniczania parametrów i wartości parametrów mających zastosowanie do tego segmentu. Przecinek ( " ,") zastrzeżony postać jest często używana do podobnych celów. Na przykład jeden URI producent może używać segmentu, takiego jak "name; v=1.1", aby wskazać odniesienie do wersji 1.1 "Nazwa", podczas gdy inny może użyć segmentu, takiego jak "nazwa,1.1" do / align = "left" / Typy parametrów mogą być definiowane według schematu semantyki, ale w większości przypadków składnia parametru jest specyficzna do implementacji algorytmu dereferencyjnego URIs.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-20 15:44:32
Nie można wpisać go bezpośrednio na pasku URL przeglądarki.
Możesz zobaczyć, jak dane POST są wysyłane w Internecie z Live HTTP Headers na przykład. Wynik będzie coś takiego
http://127.0.0.1/pass.php
POST /pass.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://127.0.0.1/pass.php
Cookie: passx=87e8af376bc9d9bfec2c7c0193e6af70; PHPSESSID=l9hk7mfh0ppqecg8gialak6gt5
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
username=zurfyx&pass=password
Gdzie jest napisane
Content-Length: 30
username=zurfyx&pass=password
Będzie wartością post.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 17:51:30
Domyślnym typem nośnika w żądaniu POST jest application/x-www-form-urlencoded
. Jest to format kodowania par klucz-wartość. Klucze mogą być zduplikowane. Każda para klucz-wartość jest oddzielona znakiem &
, a każdy klucz jest oddzielony od swojej wartości znakiem =
.
Na przykład:
Name: John Smith
Grade: 19
Jest zakodowane jako:
Name=John+Smith&Grade=19
Jest to umieszczone w treści żądania po nagłówkach HTTP.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 17:48:38
Niektóre Usługi internetowe wymagają oddzielnego umieszczenia danych request i metadanych . Na przykład funkcja zdalna może oczekiwać, że podpisany łańcuch metadanych jest zawarty w URI, podczas gdy dane są publikowane w ciele HTTP.
Żądanie POST może semantycznie wyglądać tak:
POST /?AuthId=YOURKEY&Action=WebServiceAction&Signature=rcLXfkPldrYm04 HTTP/1.1
Content-Type: text/tab-separated-values; charset=iso-8859-1
Content-Length: []
Host: webservices.domain.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: identity
User-Agent: Mozilla/3.0 (compatible; Indy Library)
name id
John G12N
Sarah J87M
Bob N33Y
To podejście logicznie łączy QueryString i Body-Post używając pojedynczej Content-Type
, która jest "instrukcją parsowania" dla serwera www.
Uwaga: HTTP/1.1 jest owinięte z #32
(spacja) po lewej i z #10
(kanał linii) po prawej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-31 14:01:37
Wartości formularzy w postach HTTP są wysyłane w treści żądania, w tym samym formacie, co querystring.
Aby uzyskać więcej informacji, zobacz spec .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-27 19:20:19
Po pierwsze, rozróżnijmy GET
i POST
Get: jest to domyślne żądanie HTTP
, które jest wysyłane do serwera i jest używane do pobierania danych z serwera, a łańcuch zapytań, który pojawia się po ?
w URI
jest używany do pobierania unikalnego zasobu.
To jest format
GET /someweb.asp?data=value HTTP/1.0
Tutaj data=value
jest przekazywana wartość ciągu zapytania.
POST: służy do bezpiecznego wysyłania danych do serwera, więc wszystko, co jest potrzebne, jest to format POST
żądania
POST /somweb.aspHTTP/1.0
Host: localhost
Content-Type: application/x-www-form-urlencoded //you can put any format here
Content-Length: 11 //it depends
Name= somename
Dlaczego POST over GET?
W GET
wartość wysyłana do serwerów jest zwykle dołączana do podstawowego adresu URL w ciągu zapytania,teraz są 2 konsekwencje tego
- żądania
GET
są zapisywane w historii przeglądarki z parametrami. Dzięki temu Twoje hasła pozostają niezaszyfrowane w historii przeglądarki. To był prawdziwy problem dla Facebook z powrotem w czasach. - zazwyczaj serwery mają limit czasu
URI
może być. Jeśli zostanie wysłanych zbyt wiele parametrów, możesz otrzymać414 Error - URI too long
W przypadku żądania post Twoje dane z pól są dodawane do treści. Długość param żądań jest obliczana i dodawana do nagłówka dla Content-length i żadne ważne dane nie są bezpośrednio dołączane do adresu URL.
Możesz użyć sekcji Sieci narzędzi programistycznych Google, aby zobaczyć podstawowe informacje o tym, jak zapytania są wysyłane do serwerów.
I zawsze możesz dodać więcej wartości w twoim Request Headers
Jak Cache-Control
, Origin
, Accept
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-23 00:29:18