HTTP POST prašo pateikti papildomus duomenis iš kliento (naršyklės) į serverį žinutės tekste. Priešingai, GAUTI užklausose URL yra visi reikalingi duomenys. HTML formos gali naudoti bet kurį metodą, nurodydamos metodas = „POST“ arba metodas = „GET“ (numatytasis) elementas. Nurodytas metodas nustato, kaip formos duomenys pateikiami serveriui. Kai metodas yra GET, visi formos duomenys yra užkoduojami URL, pridedamame prie veiksmas URL kaip užklausos eilutės parametrai. Naudojant POST, formos duomenys pasirodo HTTP užklausos pranešimo tekste.
GAUTI | POST | |
---|---|---|
Istorija | Parametrai išlieka naršyklės istorijoje, nes jie yra URL dalis | Parametrai neišsaugomi naršyklės istorijoje. |
Pažymėta | Galima žymėti. | Negalima pažymėti. |
Mygtukas „BACK“ / pakartoti elgesį | GET užklausos yra pakartotinai vykdomos, tačiau negali būti pakartotinai pateiktos serveriui, jei HTML yra saugomas naršyklės talpykloje. | Paprastai naršyklė įspėja vartotoją, kad duomenis reikės pateikti iš naujo. |
Kodavimo tipas (enctype atributas) | paraiška / x-www-forma-urlencoded | multipart / form-data arba application / x-www-form-urlencoded Dvejetainiams duomenims naudokite kelių dalių kodavimą. |
Parametrai | galime siųsti, bet parametrų duomenys apsiriboja tuo, ką galime įtraukti į užklausos eilutę (URL). Saugiausia naudoti mažiau nei 2K parametrus, kai kurie serveriai tvarko iki 64K | Gali nusiųsti parametrus, įskaitant failų įkėlimą, į serverį. |
Nulaužė | Lengviau nulaužti scenarijaus vaikams | Sunkiau nulaužti |
Formos duomenų tipo apribojimai | Taip, leidžiami tik ASCII simboliai. | Jokių apribojimų. Taip pat leidžiami dvejetainiai duomenys. |
Saugumas | GET yra mažiau saugus, palyginti su POST, nes siunčiami duomenys yra URL dalis. Taigi, tai išsaugoma naršyklės istorijoje ir serverio žurnaluose paprastu tekstu. | POST yra šiek tiek saugesnis nei GET, nes parametrai nėra saugomi naršyklės istorijoje ar žiniatinklio serverio žurnaluose. |
Formos duomenų ilgio apribojimai | Taip, nes formos duomenys yra URL ir URL ilgis yra ribotas. Saugus URL ilgio apribojimas dažnai yra 2048 simboliai, tačiau skiriasi priklausomai nuo naršyklės ir interneto serverio. | Jokių apribojimų |
Naudojamumas | GET metodas neturėtų būti naudojamas siunčiant slaptažodžius ar kitą neskelbtiną informaciją. | POST metodas, naudojamas siunčiant slaptažodžius ar kitą neskelbtiną informaciją. |
Matomumas | GET metodas yra matomas visiems (jis bus rodomas naršyklės adreso juostoje) ir turi ribotas siunčiamos informacijos apimtis.. | POST metodo kintamieji URL nerodomi. |
Talpykloje | Galima talpykloje | Ne talpykloje |
Esminis skirtumas tarp METODAS = „GET“ ir METODAS = „POST“ yra tai, kad jie atitinka skirtingos HTTP užklausos, kaip apibrėžta HTTP specifikacijose. Abiejų metodų pateikimo procesas prasideda tuo pačiu būdu - naršyklėje sukuriamas formos duomenų rinkinys, o tada užkoduojamas nurodytu būdu. enctype atributas. Dėl METODAS = „PASIŪLYTI enctype atributas gali būti daugiadalyviai / formos duomenys arba paraiška / x-www-forma-urlencoded, kadangi už METODAS = „GET“, tik paraiška / x-www-forma-urlencoded leidziama. Tada šios formos duomenų rinkinys perduodamas į serverį.
Pateikiant formą naudojant METHOD = "GET", naršyklė sukuria URL, paėmusi veiksmas atributas, pridedant a ? prie jo, tada pridedami formos duomenų rinkiniai (užkoduoti naudojant „application / x-www-form-urlencoded“ turinio tipą). Tada naršyklė apdoroja šį URL taip, tarsi sektų nuorodą (arba taip, lyg vartotojas būtų įvedęs URL tiesiogiai). Naršyklė padalija URL į dalis ir atpažįsta pagrindinį kompiuterį, tada siunčia tam kompiuteriui GET užklausą su likusiu URL kaip argumentą. Serveris paima jį iš ten. Atminkite, kad šis procesas reiškia, kad formos duomenys yra ribojami ASCII kodais. Ypatingai atsargiai reikia koduoti ir iššifruoti kitų tipų simbolius, perduodant juos per URL ASCII formatu.
Pateikus formą su METHOD = "POST", POST užklausa turi būti išsiųsta naudojant veiksmas atributas ir pranešimas, sukurtas pagal enctype atributas.
Kadangi formos duomenys siunčiami kaip URL dalis, kai GAUTI yra naudojamas --
Iš esmės pateiktos formos duomenų tvarkymas priklauso nuo to, ar jie siunčiami su METODAS = „GET“ arba METODAS = „POST“. Kadangi duomenys yra užkoduojami skirtingais būdais, reikalingi skirtingi dekodavimo mechanizmai. Taigi paprastai keičiant METODĄ gali reikėti pakeisti scenarijų, kuris apdoroja pateikimą. Pavyzdžiui, naudojant CGI sąsają, scenarijus gauna duomenis iš aplinkos kintamojo (QUERYSTRING), kai GAUTI yra naudojamas. Bet kai POST yra naudojamas, formos duomenys perduodami standartiniame įvesties sraute (stdin) ir skaitomų baitų skaičių nurodo antraštė „Turinio ilgis“.
GET rekomenduojama pateikti pateikiant „idempotentines“ formas - tas, kurios „nekeičia reikšmingo pasaulio būvio“. Kitaip tariant, formos, susijusios tik su duomenų bazių užklausomis. Kita perspektyva yra ta, kad kelios idempotentinės užklausos turės tokį patį poveikį kaip ir viena užklausa. Jei reikia atnaujinti duomenų bazę ar atlikti kitus veiksmus, pvz., Suaktyvinti el. Laiškus, rekomenduojama naudoti POST.
Iš „Dropbox“ kūrėjų tinklaraščio:
naršyklė tiksliai nežino, ką daro tam tikra HTML forma, tačiau jei forma pateikiama naudojant HTTP GET, naršyklė žino, kad saugiai galima automatiškai pakartoti pateikimą, jei įvyksta tinklo klaida. Formas, kurios naudoja HTTP POST, gali būti nesaugu pakartoti, todėl naršyklė pirmiausia paprašo vartotojo patvirtinimo.
„GET“ užklausa dažnai yra talpykloje, tuo tarpu „POST“ užklausa vargu ar gali būti. Užklausų sistemoms tai gali turėti nemažą efektyvumą, ypač jei užklausų eilutės yra paprastos, nes talpyklos gali būti naudojamos dažniausiai pasitaikančioms užklausoms.
Tam tikrais atvejais naudojant POST rekomenduojama net idempotentinėms užklausoms:
Atnaujinta 2015 m. Gegužės 15 d.: Ar konkrečiai naudojant HTTPS (HTTP per TLS / SSL), POST teikia daugiau saugumo nei GET?
Tai įdomus klausimas. Tarkime, kad pateikiate GET užklausą į tinklalapį:
GET https://www.example.com/login.php?user=mickey&passwd=mini
Darant prielaidą, kad jūsų interneto ryšys yra stebimas, kokią informaciją apie šią užklausą gaus snooperis? Jei vietoj to bus naudojamas POST, o vartotojo ir slaptažodžių duomenys bus įtraukti į POST kintamuosius, ar tai bus saugesnė naudojant HTTPS ryšius?
Atsakymas yra ne. Jei pateiksite tokią GET užklausą, užpuolikui, stebinčiam jūsų interneto srautą, bus žinoma tik ši informacija:
Kelio URL dalis, t. Y. Tikrasis prašomas puslapis, taip pat užklausos eilutės parametrai, yra saugomi (šifruojami), kol jie yra „už laido“, t. Y. Keliaujant pakeliui į paskirties serverį. Panašiai yra ir POST užklausų atveju.
Be abejo, žiniatinklio serveriai prieigos žurnaluose paprastai registruoja visą URL paprastu tekstu; todėl neskelbtinos informacijos siuntimas naudojant GET nėra gera idėja. Tai taikoma neatsižvelgiant į tai, ar naudojamas HTTP, ar HTTPS.