Kaip siunčiami parametrai HTTP POST užklausai?

HTTP GET užklausoje parametrai siunčiami kaip užklausos eilutė. :

  http://example.com/page ? parametras = reikšmė  taip pat kitas 

HTTP POST užklausoje parametrai nėra siunčiami su URI.

Kur yra vertybės? Prašymo antraštėje? Prašymo dalyje? Ką tai atrodo?

1170
27 янв. Camilo Martin rinkosi sausio 27 d 2013-01-27 22:19 '13, 22:19 PM 2013-01-27 22:19
@ 9 atsakymai

Vertės siunčiamos užklausos įstaigai turinio tipo nurodytu formatu.

Paprastai turinio tipas yra application/x-www-form-urlencoded , todėl užklausos įstaiga naudoja tą patį formatą kaip užklausos eilutė:

 parameter=value> 

Kai naudojate failo įkėlimą formoje, vietoj to naudojate įvairaus formato multipart/form-data kodavimą. Tai yra sudėtingesnė, tačiau paprastai nereikia rūpintis, kaip atrodo, todėl aš nerodysiu pavyzdžio, tačiau gali būti naudinga žinoti, kad ji egzistuoja.

970
27 янв. Guffa atsakymas, sausio 27 d 2013-01-27 22:32 '13, 10:32 pm 2013-01-27 22:32

Turinys pateikiamas po HTTP antraštių. HTTP POST formatą turėtų sudaryti HTTP antraštės, po kurių turi būti tuščia eilutė, po kurios eina užklausos įstaiga. POST kintamieji yra saugomi kaip pagrindinės vertės poros organizme.

Tai galima matyti iš toliau pateikto pradinio HTTP pranešimo turinio:

border=0
 POST /path/script.cgi HTTP/1.0 From: frog@jmarshall.com User-Agent: HTTPTool/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 32 home=Cosby> 

Tai galite pamatyti naudodami tokį įrankį kaip „ Fiddler“ , kurį galite naudoti norėdami peržiūrėti neapdorotus HTTP užklausos ir atsakymo prašymus, išsiųstus siunčiant.

353
27 янв. Atsakyti Joe Alfano Jan 27 2013-01-27 22:21 '13, 10:21 val. 2013-01-27 22:21

Trumpas atsakymas yra toks: POST užklausose vertės siunčiamos užklausos žyma. Su žiniatinklio formomis jie greičiausiai siunčiami su žiniasklaidos tipo application/x-www-form-urlencoded arba multipart/form-data . Programavimo kalbos arba sistemos, skirtos tvarkyti žiniatinklio užklausas, paprastai atlieka „The Right Thing ™“ su tokiais prašymais ir suteikia jums lengvai prieinamus lengvai dekoduotus duomenis (pvz., $_REQUEST arba $_POST PHP arba cgi.FieldStorage() , flask.request.form Python).


Dabar paleiskite šiek tiek, kas gali padėti suprasti skirtumą;)

Skirtumas tarp GET ir POST iš esmės yra semantinis. Jie taip pat „naudojami“ kitaip, o tai paaiškina skirtumą tarp vertybių perdavimo.

GET ( atitinkamas RFC skyrius )

Vykdydami GET užklausą, prašote serverio vienam ar keliems objektams. Kad klientas galėtų filtruoti rezultatą, jis gali naudoti vadinamąjį „užklausų eilutės“ URL. Užklausos eilutė yra dalis po ? . Tai yra URI sintaksės dalis .

Taigi, atsižvelgiant į jūsų paraiškos kodą (dalį, kuri gauna užklausą), turėsite patikrinti užklausos URI dalį, kad galėtumėte pasiekti šias vertes.

Atkreipkite dėmesį, kad raktai ir reikšmės yra URI dalis. Naršyklės gali nustatyti ribą URI ilgiui. HTTP standartas nurodo, kad nėra jokių apribojimų. Tačiau šio rašymo metu dauguma naršyklių riboja URI (neturiu konkrečių verčių). GET užklausos niekada neturėtų būti naudojamos naujai informacijai siųsti serveryje. Ypač ne dideli dokumentai. Čia turite naudoti POST arba PUT .

POST ( atitinkamas RFC skyrius )

Atliekant POST užklausą, klientas siunčia naują dokumentą į nuotolinį kompiuterį. Taigi užklausos eilutė nėra (semantiškai) prasminga. Štai kodėl jūs neturite prieigos prie jų paraiškos kodo.

POST tiek sudėtingesnė (ir lankstesnė):

Gavę POST užklausą, visada turėtumėte tikėtis „naudingosios apkrovos“ arba HTTP: pranešimo kūno . Pranešimo kūnas yra gana nenaudingas, nes nėra standarto (kiek galiu pasakyti. Galbūt programa / octet-stream?) Formatas. Kūno formatą apibrėžia Content-Type antraštė. Naudojant HTML FORM elementą su method="POST" tai paprastai application/x-www-form-urlencoded . Kitas labai dažnas tipas yra kelių dalių / formų duomenys, jei naudojate failų įkėlimus. Tačiau gali būti nieko: iš text/plain , daugiau application/json ar net pasirinktinio application/octet-stream .

Bet kuriuo atveju, jei POST užklausa vykdoma Content-Type , kurio negalima apdoroti programa, ji turi grąžinti 415 būsenos kodą .

Dauguma programavimo kalbų (ir (arba) žiniatinklio karkasų) siūlo būdą, kaip perduoti pranešimo kūną iš / į dažniausiai pasitaikančius tipus (pvz., application/x-www-form-urlencoded , multipart/form-data arba application/json ). Taip paprasta. Pasirinktiniams tipams gali prireikti šiek tiek daugiau darbo.

Naudojant standartinį HTML dokumentą, koduotą kaip pavyzdį, programa turėtų atlikti šiuos veiksmus:

  • Perskaitykite Content-Type lauką
  • Jei vertė nėra viena iš palaikomų laikmenų tipų, grąžinkite atsakymą su būsenos kodu 415
  • kitaip dekoduoti reikšmes iš pranešimo kūno.

Vėlgi, tokios kalbos, kaip PHP, ar kitų populiarių kalbų internetinės sistemos, gali jums tai padaryti. Išimtis yra 415 klaida. Nė viena struktūra negali prognozuoti, kokio tipo turinys jūsų paraišką palaiko ir (arba) nepalaiko. Tai priklauso nuo jūsų.

PUT ( atitinkamas RFC skyrius )

PUT užklausa iš esmės tvarkoma taip pat kaip ir POST užklausa. Didelis skirtumas yra tas, kad POST užklausa turėtų leisti serveriui nuspręsti, kaip (ir, jei apskritai) sukurti naują šaltinį. Istoriškai (nuo dabar pasenusio RFC2616 jis turėjo sukurti naują šaltinį kaip „pavaldinį“ (vaikų) URI, kur buvo išsiųstas prašymas).

PUT prašymas, priešingai, turi „atidėti“ šio konkretaus URI resursą ir šį turinį. Ne daugiau, ne mažiau. Idėja yra ta, kad klientas yra atsakingas už pilno išteklių kūrimą prieš „PUTting“. Serveris turi jį priimti taip, kaip jis yra nurodytame URL.

Todėl POST užklausa paprastai nėra naudojama esamam ištekliui pakeisti. PUT užklausa gali sukurti ir pakeisti.

Šoninė pastaba

Taip pat yra „ kelio parametrų “, kuriuos galima naudoti norint siųsti papildomus duomenis į konsolę, tačiau jie yra tokie neįprasti, kad laimėjau. Tačiau, norint pateikti nuorodą, čia yra ištrauka iš RFC:

Be taškų segmentų hierarchiniuose keliuose, kelio segmentas yra laikomas nepermatomas pagal apibendrintą sintaksę. URI programose dažnai naudojami rezervuoti simboliai, leidžiantys segmente atskirti schemas ar subkomponentus, kurie yra būdingi dereferencijai. Pvz., Kabliataškis (";") ir lygūs ("=") rezervuoti simboliai dažnai naudojami norint nustatyti šiam segmentui taikomus parametrus ir parametrų vertes. Komanda (",") simbolis dažnai naudojamas panašiems tikslams. Pavyzdžiui, vienas gamintojas URI gali naudoti segmentą, pvz., „Pavadinimas; v = 1.1“, norėdamas nurodyti nuorodą į „vardo“ 1.1 versiją, o kitas gali naudoti segmentą, pvz., „Pavadinimas, 1.1“, nurodydamas tą patį. Parametrų tipai gali būti apibrėžti pagal semantikos schemą, tačiau daugeliu atvejų parametrų sintaksė yra specifinė URI dereference algoritmo įgyvendinimui.

289
03 нояб. atsakymas pateikiamas exhuma 03 Nov. 2014-11-03 18:54 '14 at 18:54 2014-11-03 18:54

Negalite ją tiesiogiai įvesti naršyklės URL juostoje.

Galite pamatyti, kaip „POST“ duomenys siunčiami internetu naudojant „ Live HTTP“ antraštes . Rezultatas bus kažkas panašaus

 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-Encoding: identity User-Agent: Mozilla/3.0 (compatible; Indy Library) name id John G12N Sarah J87M Bob N33Y 

Šis metodas logiškai sujungia „QueryString“ ir „Body-Post“, naudodamas vieną Content-Type , kuris yra žiniatinklio serverio „analizavimo instrukcija“.

Pastaba: HTTP / 1.1 yra uždarytas #32 (tarpas) kairėje ir #10 (eilutė) dešinėje.

13
31 июля '15 в 17:01 2015-07-31 17:01 atsakymas pateikiamas sąsaja nežinoma liepos 31 d. 15 val. 17:01 2015-07-31 17:01

Formos vertės HTTP-POST pranešimuose siunčiamos užklausos įstaigai tokiu pačiu formatu kaip prašymas.

Norėdami gauti daugiau informacijos, žr.

13
27 янв. atsakymas pateikiamas SLaks 27 sausis 2013-01-27 22:20 '13, 10:20 pm 2013-01-27 22:20

Visų pirma, leiskite atskirti GET ir POST

Priimti: tai yra numatytasis HTTP prašymas, pateiktas serveryje ir naudojamas norint gauti duomenis iš serverio ir užklausos eilutės, kuri atsiranda po ? URI naudojamas išskirti unikalų šaltinį.

tai yra formatas

 GET /someweb.asp?data=value HTTP/1.0 

čia data=value yra perduodama užklausos eilutės vertė.

POST: jis naudojamas saugiam duomenų siuntimui į serverį, kad visa, kas reikalinga, yra POST užklausos formatas.

 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 

Kodėl POST per GET?

GET serveriams siunčiama vertė paprastai įtraukiama į užklausos eilutės pagrindinį URL. Tai leidžia jums įsilaužti į jūsų duomenis (tai buvo problema „Facebook“ dienose, kur buvo nustatyti jūsų kredencialai), todėl POST naudojamas duomenims siųsti į serverį, kuris naudojo Request Body , siųsti duomenis į serverį, kuris yra saugesnis, nes jis slepia jūsų duomenis, ir jis gauna jūsų duomenis iš laukų, apskaičiuoja jo ilgį ir prideda jį prie content-length header ir jokie svarbūs duomenys tiesiogiai neįtraukiami į URL

Dabar, kai jūsų prašymas yra apsaugotas, bet kurios serveriui siunčiamos reikšmės gali būti siunčiamos Request Body , nes pavadinimas reiškia, kad jame bus duomenų naudotojų, kuriuos norėtumėte siųsti (ir jis siunčiamas į URL Encoded formatus) ir Request Headers saugo užklausą saugiai, lygindamas Request Body ir Request Headers vertes

„Google“ kūrėjų įrankių tinklo skyriuje galite sužinoti pagrindinę informaciją apie tai, kaip užklausos vykdomos serveriuose.

ir visada galite pridėti daugiau vertybių Request Headers pvz., „ Cache-Control , „ Origin , „ Accept .

0
19 июля '18 в 10:04 2018-07-19 10:04 atsakymas pateikiamas Zeeshan Adil liepos 19 d., 18 val. 10:04 ; 2018-07-19 10:04

Jei norite pridėti daugiau informacijos, toliau pateikiami skirtumai.

Java, kaip HTTP klientas, parodė GET ir POST užklausos formavimą. Pastabos dėl pastabos aprašymo.

 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;  public class GET_POST { private final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04"; // GET action URL, query string appended to the URL as ?stype=models private final String urlGET = "https://www.servicesplus.sel.sony.com/PartsPLUSResults.aspx?stype=models"; // POST action URL private final String urlPOST = "https://sg.campaign.samsung.com/smartacademy/controller/controller.php/getLocation"; // Post data or a payload private String postDataBody = "state=West"; // Main class public static void main(String[] args) throws Exception { GET_POST http = new GET_POST(); System.out.println("Testing send HTTP GET request HTML output is below \n"); http.sendGET(); System.out.println( "--------------------------------------------------------------------------------------------------------"); System.out.println("Testing send HTTP POST request HTML output is below \n"); http.sendPost(); } // HTTP POST request private void sendPost() throws Exception { // POST example URL URL obj = new URL(urlPOST); // Send post request HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // Basic reuqest header to simulate a browser request con.setRequestMethod("POST"); con.setRequestProperty("User-Agent", USER_AGENT); con.setRequestProperty("Accept-> 
-1
05 дек. Atsakymą pateikė Vaibs 05 dec. 2017-12-05 00:39 '17 at 0:39 2017-12-05 00:39

Kiti klausimai apie žymes arba Užduoti klausimą