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?

Author: Termininja, 2013-01-27

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.

 1314
Author: Guffa,
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.

 438
Author: Joe Alfano,
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:

  1. przeczytaj pole Content-Type
  2. jeśli wartość nie jest jednym z obsługiwanych typów nośników, zwróć odpowiedź z kodem statusu 415
  3. 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 przeciwieństwie do tego, żądanie ma "zdeponować" zasób dokładnie W tym URI, a z dokładnie tą treścią. Ani więcej, ani mniej. Chodzi o to, że klient jest odpowiedzialny za stworzenie kompletnego zasobu przed jego "umieszczeniem". Serwer powinien przyjąć jako-jest na podanym URL.

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.

 398
Author: exhuma,
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.

 62
Author: zurfyx,
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.

 26
Author: Nejat,
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.

 20
Author: Interface Unknown,
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 .

 18
Author: SLaks,
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.

 9
Author: Zeeshan Adil,
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