Jaka jest różnica między POST a GET? [duplikat]

To pytanie ma już odpowiedź tutaj:

Dopiero od niedawna zajmuję się PHP / AJAX / jQuery i wydaje mi się, że ważną częścią tych technologii są POST i GET.

Po pierwsze, jaka jest różnica między POST A GET? Dzięki eksperymentom wiem, że GET dołącza zwracające zmienne i ich wartości do ciągu URL

website.com/directory/index.php?name=YourName&bday=YourBday

Ale POST nie.

Więc, czy to jedyna różnica, czy istnieją konkretne zasady lub konwencje dotyczące korzystania z jednej lub drugiej?

Po Drugie, widziałem również POST i GET poza PHP: również w AJAX i jQuery. Czym różnią się POST i GET między tymi trzema? Czy są to ten sam pomysł, ta sama funkcjonalność, po prostu wykorzystywane inaczej?

Author: nbro, 2010-08-13

8 answers

GET i POST są dwoma różnymi typami żądań HTTP.

Według Wikipedii :

GET żąda reprezentacji określonego zasobu. Należy pamiętać, że GET nie powinien być używany do operacji powodujących skutki uboczne, takich jak używanie go do podejmowania działań w aplikacjach internetowych. Jednym z powodów jest to, że GET może być używany arbitralnie przez roboty lub gąsienice, które nie powinny brać pod uwagę skutków ubocznych, które żądanie powinno przyczyna.

I

POST przesyła dane do przetworzenia (np. z formularza HTML) do zidentyfikowanego zasobu. Dane są zawarte w treści żądania. Może to prowadzić do utworzenia nowego zasobu lub aktualizacji istniejących zasobów lub obu tych.

Więc zasadniczo GET jest używany do pobierania zdalnych danych, a POST jest używany do wstawiania/aktualizowania zdalnych danych.


Specyfikacja HTTP / 1.1 (RFC 2616) Sekcja 9 definicje metod zawiera więcej informacji na temat GET i POST, a także innych metod HTTP, jeśli jesteś zainteresowany.

Oprócz wyjaśnienia zamierzonego zastosowania każdej metody, spec podaje również co najmniej jeden praktyczny powód, dla którego GET powinny być używane tylko do pobierania danych:

Autorzy usług korzystających z protokołu HTTP nie powinni używać formularzy GET based do przesyłania wrażliwych danych, ponieważ spowoduje to, że dane te będą zakodowane w Request-URI. Wiele istniejących serwerów, serwerów proxy i agentów użytkowników rejestruje URI żądania w miejscu, w którym może być widoczny dla osób trzecich. Serwery mogą zamiast tego korzystać z wysyłania formularzy POST


Wreszcie, ważną kwestią przy użyciu {[0] } dla żądań AJAX jest to, że niektóre przeglądarki-w szczególności IE - będą buforować wyniki żądania GET. Więc jeśli, na przykład, ankieta przy użyciu tego samego GET żądanie zawsze otrzymasz z powrotem to samo wyniki, nawet jeśli dane, o które prosisz, są aktualizowane po stronie serwera. Jednym ze sposobów na złagodzenie tego problemu jest uczynienie adresu URL unikalnym dla każdego żądania poprzez dodanie znacznika czasu.
 389
Author: Justin Ethier,
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-03-28 19:46:37

A POST, w przeciwieństwie do a GET, zazwyczaj zawiera istotne informacje w treści żądania. (A GET nie powinny mieć ciała, więc oprócz plików cookie, jedynym miejscem do przekazania informacji jest adres URL.) Poza tym, że adres URL jest stosunkowo czystszy, POST pozwala również wysyłać znacznie więcej informacji (ponieważ adresy URL są ograniczone w długości, dla wszystkich praktycznych celów), i pozwala wysyłać prawie każdy rodzaj danych (formularze przesyłania plików, na przykład, nie mogą używać GET -- muszą używać POST plus specjalnej treści Typ/kodowanie).

Poza tym, POST oznacza, że prośba coś zmieni i nie powinna być przerobiona. Dlatego czasami przeglądarka pyta, czy chcesz ponownie przesłać dane formularza po naciśnięciu przycisku "Wstecz".

GET, z drugiej strony, powinno być idempotent - co oznacza, że możesz to zrobić milion razy, a serwer zrobi to samo (i pokaże w zasadzie ten sam wynik) za każdym razem.

 76
Author: cHao,
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-06-30 00:30:52

Naucz się podstaw protokołu HTTP

To jest podobne do jazdy samochodem. Kupujesz sobie samochód i wyruszasz w drogę, ale nie znasz żadnych znaków, świateł ani innych zasad, których musisz przestrzegać. Oczywiście nie jesteś w stanie prowadzić, nawet jeśli wiesz, jak zarządzać samochodem. Przynajmniej Nie bezpiecznie. Ani dla siebie, ani dla innych.

Powinieneś dowiedzieć się trochę o protokole HTTP. GET / POST nie są powiązane (przynajmniej nie bezpośrednio) z PHP/AJAX/jQuery lub podobne. Używają ich, ponieważ do komunikacji używa protokołu HTTP. I jest o wiele więcej do protokołu HTTP niż tylko GET i POST.

Sprawdź niektóre z nich, a następnie Szukaj na własną rękę, jak również:

 22
Author: Robert Koritnik,
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-03-13 10:54:08

Chociaż nie jest to opis różnic, poniżej znajduje się kilka rzeczy do przemyślenia przy wyborze właściwej metody.

  • żądania GET mogą być buforowane przez przeglądarkę, co może być problemem (lub korzyścią) podczas korzystania z ajax.
  • żądania GET ujawniają parametry użytkownikom (POST robi tak samo, ale są mniej widoczne).
  • POST może przekazać znacznie więcej informacji do serwera i może być prawie dowolnej długości.
 22
Author: Alex,
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-06-23 04:51:54

POST I GET to dwie Metody żądania HTTP. GET jest zwykle przeznaczony do pobierania niektórych danych i oczekuje się, że będzie idempotentny (powtarzanie zapytania nie ma żadnych skutków ubocznych) i może wysyłać tylko ograniczone ilości danych parametrów do serwera. Żądania GET są często domyślnie buforowane przez niektóre przeglądarki, jeśli nie jesteś ostrożny.

POST jest przeznaczony do zmiany stanu serwera. Niesie więcej danych, a powtarzanie zapytania jest dozwolone (i często oczekiwane), aby efekty uboczne, takie jak tworzenie dwóch komunikatów zamiast jednego.

 15
Author: Victor Nicollet,
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
2010-08-13 13:44:33

Jeśli pracujesz RESTfully, GET powinien być używany do żądań, w których otrzymujesz tylko dane, a POST powinien być używany do żądań, w których coś się dzieje.

Niektóre przykłady:

  • GET the page showing a specific SO question

  • Dodaj komentarz

  • Wyślij prośbę o POST, klikając przycisk "Dodaj do koszyka".

 11
Author: Skilldrick,
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
2018-04-28 11:51:51

Z postem możesz również wykonywać wieloczęściowe kodowanie mime, co oznacza, że możesz również załączać pliki. Również jeśli używasz zmiennych post w nawigacji stron, użytkownik otrzyma ostrzeżenie z pytaniem, czy chce ponownie przesłać parametr post. Zazwyczaj wyglądają tak samo w żądaniu HTTP, ale powinieneś po prostu trzymać się postów, jeśli chcesz "opublikować" coś na serwer i "dostać", jeśli chcesz dostać coś z serwera, ponieważ jest to sposób, w jaki były zamierzone.

 6
Author: Matt Williamson,
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
2010-08-13 13:45:40

Jedyną "dużą" różnicą między POST & GET (podczas korzystania z nich z AJAX) jest to, że GET jest dostarczany URL, są one ograniczone w swojej długości(ponieważ URL nie ma nieskończonej długości).

 1
Author: Activist,
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
2010-08-13 15:07:05