HTTP apibrėžia skirtingus sąveikos su serveriu būdus ir yra 4 pagrindiniai metodai, būtent GET, POST, PUT ir DELETE. Visas URL pavadinimas yra išteklių aprašas, galime jį įsivaizduoti taip: URL adresas, jis naudojamas tinklo ištekliams apibūdinti, o GET, POST, PUT, DELETE HTTP atitinka keturias šio ištekliaus tikrinimo, modifikavimo, pridėjimo ir ištrynimo operacijas. Šiuo metu turėtumėte turėti bendrą supratimą, GET paprastai naudojamas išteklių informacijai gauti/užklausti, o POST paprastai naudojamas išteklių informacijai atnaujinti.
1. Pagal HTTP specifikaciją, GET naudojamas informacijai gauti ir turėtų būti saugus ir idempotentas.
(1). Vadinamasis saugumas reiškia, kad operacija naudojama informacijai gauti, o ne ją modifikuoti. Kitaip tariant, GET užklausos paprastai neturėtų turėti šalutinio poveikio. Tai reiškia, kad jis gauna tik išteklių informaciją, kaip ir duomenų bazės užklausa, ir nemodifikuos, nepridės duomenų ir neturės įtakos išteklių būsenai.
* Pastaba: saugumo reikšmė čia reiškia tik nepakeistą informaciją.
(2). idempotent reiškia, kad kelios užklausos tuo pačiu URL turėtų pateikti tą patį rezultatą.
Tačiau praktiškai minėtos dvi taisyklės nėra tokios griežtos. Kitų žmonių straipsnių citavimo pavyzdžiai: Pavyzdžiui, naujienų svetainės pirmasis puslapis nuolat atnaujinamas. Nors antroji užklausa pateikia kitą naujienų paketą, operacija vis tiek laikoma saugia ir idempotentiška, nes ji visada pateikia dabartines naujienas. Iš esmės, jei tikslas yra tas, kad vartotojas, atidaręs nuorodą, galėtų būti tikras, kad šaltinis nebuvo pakeistas jo požiūriu.
2. Pagal HTTP specifikaciją POST reiškia užklausą, kuri gali pakeisti serverio išteklius. Toliau cituojant aukščiau pateiktą pavyzdį: Vis dar naujienos Paimkite svetainę kaip pavyzdį, skaitytojai turėtų skelbti savo komentarus apie naujienas, nes svetainės ištekliai skiriasi po komentaro pateikimo, arba ištekliai yra pakeisti.
Aukščiau apytiksliai aptariami kai kurie GET ir POST principai HTTP specifikacijoje. Tačiau daugelis žmonių nesilaiko HTTP specifikacijos, o tai gali sukelti daug šios problemos priežasčių, tokių kaip:
1. Daugelis žmonių naudoja GET atnaujinti išteklius, nes jie turi eiti į formą naudoti POST, kuris bus šiek tiek varginantis.
2. Išteklių pridėjimo, ištrynimo, modifikavimo ir tikrinimo operacija iš tikrųjų gali būti atlikta per GET/POST, nenaudojant PUT ir DELETE.
3. Kitas dalykas yra tai, kad ankstyvieji Web MVC sistemos dizaineriai sąmoningai netraktavo ir neprojektavo URL kaip abstrakčių išteklių, todėl rimta problema yra ta, kad tradicinė Web MVC sistema iš esmės palaiko tik du HTTP metodus, GET ir POST, bet nepalaiko PUT ir DELETE metodų.
* Trumpas MVC paaiškinimas: MVC iš pradžių egzistavo darbalaukio programoje, M nurodo duomenų modelį, V reiškia vartotojo sąsają, o C nurodo valdiklį. MVC naudojimo tikslas yra atskirti M ir V diegimo kodą, kad ta pati programa galėtų naudoti skirtingus vaizdus.
Aukščiau pateikti 3 punktai paprastai apibūdina senąjį stilių (griežtai nesilaikant HTTP specifikacijos), tobulėjant architektūrai, dabar yra REST (Representational State Transfer), naujas stilius, palaikantis HTTP specifikaciją.
Pakalbėję apie pagrindinę problemą, pažvelkime į skirtumą tarp GET ir POST nuo paviršiaus reiškinio:
1. GET užklausos duomenys bus pridėti prie URL (tai yra, duomenys dedami į HTTP protokolo antraštę), o ? Padalinkite URL ir persiųskite duomenis, o parametrai sujungiami &, pvz.: login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD. Jei duomenys yra angliškos raidės / skaičiai, siųskite juos tokius, kokie jie yra, jei tai yra tarpas, konvertuokite į +, jei tai kinų / kiti simboliai, tada tiesiogiai užšifruokite eilutę naudodami BASE64, kad gautumėte pavyzdį, pvz.: %E4%BD%A0%E5%A5%BD, kur XX %XX yra ASCII, vaizduojamas simboliu šešioliktaine.
POST pateikia pateiktus duomenis į HTTP paketo turinį.
2. "Maksimalus GET metodu pateiktų duomenų kiekis gali būti tik 1024 baitai, teoriškai POST nėra ribojamas, ir galima perkelti didelį duomenų kiekį, iki 80 KB IIS4 ir 100 KB IIS5??!
Aukščiau pateiktas sakinys yra nukreiptas iš kitų straipsnių, tiesą sakant, neteisinga ir netikslu tai sakyti:
(1). Visų pirma, "GET metodu pateikti duomenys gali būti ne daugiau kaip 1024 baitai", nes GET pateikia duomenis per URL, todėl duomenų kiekis, kurį gali pateikti GET, yra tiesiogiai susijęs su URL ilgiu. Tiesą sakant, nėra viršutinės URL parametrų ribos, o HTTP protokolo specifikacija neriboja URL ilgio. Šis apribojimas yra konkrečios naršyklės ir serverio nustatytas apribojimas. IE URL ilgio apribojimas yra 2083 baitai (2K+35). Kitoms naršyklėms, tokioms kaip "Netscape", "FireFox" ir kt., teorinio ilgio apribojimo nėra, o jo riba priklauso nuo operacinės sistemos palaikymo.
Atminkite, kad taip ribojamas visas URL ilgis, o ne tik parametro vertės duomenų ilgis. [Žr. 5 nuorodą]
(2). Teoriškai POST neturi dydžio apribojimo, o HTTP protokolo specifikacija neturi dydžio apribojimo, ir netikslu sakyti, kad "POST duomenims yra 80K/100K dydžio apribojimas", o POST duomenims nėra jokių apribojimų, o serverio apdorojimo galia vaidina ribojantį vaidmenį.
ASP programose užklausos objektas turi 100K duomenų ilgio apribojimą apdorojant kiekvieną formos lauką. Tačiau naudojant "Request.BinaryRead" tokio apribojimo nėra.
Be to, IIS 6.0 "Microsoft" padidino apribojimus saugumo sumetimais. Taip pat turime atkreipti dėmesį į:
1). IIS 6.0 numatytasis maksimalus 200 KB ASP POST duomenų, o apribojimas yra 100 KB vienam formos laukui. 2). Numatytasis IIS 6.0 nusiuntimo failų dydis yra 4 MB. 3). IIS 6.0 numatytoji maksimali užklausos antraštė yra 16 KB. Šie apribojimai nebuvo taikomi iki IIS 6.0. [Žr. 5 nuorodą]
Taigi aukščiau 80K ir 100K gali būti tik numatytosios reikšmės (pastaba: aš dar nepatvirtinau IIS4 ir IIS5 parametrų), bet jūs tikrai galite juos nustatyti patys. Kadangi numatytosios šių parametrų vertės kiekvienoje IIS versijoje skiriasi, išsamesnės informacijos ieškokite atitinkamame IIS konfigūracijos dokumente.
3. ASP serveris naudoja Request.QueryString, kad gautų GET užklausos parametrą, ir Request.Form, kad gautų POST užklausos parametrą. JSP naudokite request.getParameter(\"XXXX\"), kad jį gautumėte, nors jsp taip pat yra request.getQueryString() metodas, tačiau jį naudoti yra sudėtingiau, pavyzdžiui: siųskite test.jsp?name=hyddd&password=hydddd ir naudokite request.getQueryString(), kad gautumėte :name= hyddd&slaptažodis=hyddd。 PHP galite naudoti _GET ir _POST USD, kad gautumėte duomenis atitinkamai iš GET ir POST, o _REQUEST USD galite gauti duomenis iš GET ir POST užklausų. Verta paminėti, kad yra paslėptų pavojų naudojant užklausą JSP ir $_REQUEST PHP, kurie bus apibendrinti straipsnyje kitą kartą.
4.POST yra saugesnis nei GET. Pastaba: Čia paminėtas saugumas nėra ta pati sąvoka kaip "saugumas", paminėtas aukščiau pateiktame GET. Pavyzdžiui, jei pateikiate duomenis per GET, jūsų vartotojo vardas ir slaptažodis bus rodomi paprastu tekstu URL, nes (1) prisijungimo puslapis gali būti talpykloje naršyklėje, (2) kiti peržiūrės naršyklės istoriją, kad kiti galėtų gauti jūsų paskyrą ir slaptažodį klastojimo ataka.
Apibendrinant galima pasakyti, kad "Get" yra prašymas prašyti duomenų iš serverio, o "Post" yra prašymas pateikti duomenis į serverį, FORM, "Method" numatytasis "GET", iš esmės "GET" ir "POST" yra tik skirtingi siuntimo mechanizmai, o ne vienas jų ima ir siunčia!
|