Wanneer gebruik jy POST en wanneer gebruik jy KRY?
Vra
Van wat ek kan versamel, daar is drie kategorieë:
- Nog nooit gebruik
GET
en gebruikPOST
- Nog nooit gebruik
POST
en gebruikGET
- Dit maak nie saak watter een jy gebruik.
Is ek korrek in die veronderstelling dat dié drie gevalle?As dit so is, wat is'n paar voorbeelde van elk geval?
Oplossing
Gebruik POST
vir vernietigende aksies soos die skepping (Ek is bewus van die ironie), redigering, en skrap, omdat jy 'n POST
aksie in die adres bar van jou browser nie kan tref. Gebruik GET
wanneer dit veilig is om 'n persoon toelaat om 'n aksie te roep. So 'n URL soos:
http://myblog.org/admin/posts/delete/357
As jy na 'n bevestiging bladsy, eerder as om die item eenvoudig die verwydering van. Dit is baie makliker om ongelukke te vermy hierdie manier.
POST
is ook meer veilig as GET
, omdat jy nie inligting te steek in 'n URL. En so die gebruik van GET
as die method
vir 'n HTML-vorm wat 'n wagwoord of ander sensitiewe inligting versamel is nie die beste idee.
Een laaste opmerking: POST
kan 'n groter bedrag van inligting as GET
oordra. 'Post' het geen grootte beperkings vir oordraagbare data, terwyl 'kry' is beperk tot 2048 karakters.
Ander wenke
In kort
- Gebruik
GET
virsafe and
idempotent
versoeke - Gebruik
POST
virneither safe nor idempotent
versoeke
In besonderhede Daar is 'n behoorlike plek vir elke. Selfs as jy nie volg REST beginsels, kan 'n baie verkry word uit die leer oor rus en hoe 'n hulpbron-georiënteerde benadering werk.
'n rustige aansoek sal
use GETs
vir operasies wat beidesafe and idempotent
is.
'n safe
operasie is 'n operasie wat not change the data
nie versoek.
'n idempotent
werking is een waarin die uitslag maak nie saak hoeveel keer jy dit versoek sal be the same
.
Dit spreek vanself dat, as kry gebruik vir veilig bedrywighede hulle outomaties ook idempotente . Tipies van 'n te kry, is gebruik vir die herwinning van 'n hulpbron ( 'n vraag en die gepaardgaande antwoorde op stapel oorloop byvoorbeeld) of versameling van hulpbronne.
'n rustige app sal
PUTs
gebruik vir bedrywighede watnot safe but idempotent
is.
Ek weet die vraag is oor te kry en post, maar ek sal terugkeer na pos in 'n tweede.
Tipies n PUT word gebruik vir 'n hulpbron (redigering van 'n vraag of 'n antwoord op stapel oorloop byvoorbeeld) te wysig.
'n
POST
sal gebruik word vir 'n operasie watneither safe or idempotent
.
Tipies van 'n POST sal gebruik word om 'n nuwe hulpbron byvoorbeeld 'n nuwe SO vraag (maar in sommige ontwerpe 'n PUT sal ook gebruik word vir hierdie) te skep.
As jy die plaas nie twee keer jy sal uiteindelik die skep van twee nuwe vrae.
Daar is ook 'n DELETE operasie, maar ek vermoed ek kan laat dat daar:)
Bespreking
In praktiese terme moderne webblaaiers tipies net ondersteuning te kry en na betroubaar (jy kan al hierdie bedrywighede via JavaScript oproepe uit te voer, maar in terme van die aangaan data in vorms en druk stuur jy oor die algemeen het die twee opsies). In 'n REST aansoek sal die POST dikwels oorheers word om die PUT verskaf en DELETE oproepe ook.
Maar, selfs al is jy nie volgende REST beginsels, dit kan nuttig wees om te dink in terme van die gebruik van te kry vir die herwinning / besigtiging inligting en post vir die skep / redigering inligting.
Jy moet nooit gebruik te kry vir 'n operasie wat data verander. As 'n soektog 'n skakel na jou kwaad op, of die kliënt boekmerke kruip kan dit groot moeilikheid spel.
Gebruik kry as jy nie omgee nie die versoek herhaal (dit wil sê dit nie staat verander).
Gebruik POST as die operasie doen verander staat die stelsel se.
kort weergawe
Kies: Gewoonlik gebruik vir voorgelê navrae, of enige versoek waar jy wil hê dat die gebruiker in staat wees om weer trek die presiese bladsy
.Die voordele van AOO:
- URLs veilig kan geboekmerk.
- Pages kan veilig herlaai.
Die nadele van AOO:
- Veranderlikes word deurgegaan url as naam-waarde pare. (Veiligheidsrisiko)
- Beperk aantal veranderlikes wat kan oorgedra word. (Gebaseer op die leser. Byvoorbeeld, Internet Explorer is beperk tot 2048 karakters. )
NA: Gebruik vir hoër sekuriteit versoeke waar data kan gebruik word om 'n databasis of 'n bladsy wat jy wil nie iemand om boekmerk te verander.
Die voordele van die post:
- Naam waarde pare word nie vertoon in url. (Security + = 1)
- Unlimited aantal naam-waarde pare kan per pos aangeneem. Reference.
Die nadele van post:
- Page daardie pos data gebruik kan nie boekmerk. (As jy dit so verkies.)
Langer weergawe
Direk vanaf die HyperText Transfer Protocol - HTTP / 1.1 :
9.3 AOO
Die GET-metode beteken haal enige inligting (in die vorm van 'n entiteit) is geïdentifiseer deur die Versoek-URI. Indien die versoek-URI verwys na 'n data vervaardiging proses, dit is die geproduseer data wat sal teruggestuur word as die entiteit in die reaksie en nie die bronteks van die proses, tensy daardie teks gebeur met die produksie van die proses wees.
Die semantiek van die GET-metode verander na 'n "voorwaardelike GET" indien die versoek boodskap sluit in 'n As-verander-sedert, As-gemodifiseer-Sedert As-wedstryd, As-Geen-wedstryd, of As-reeks kop veld . Dat 'n voorwaardelike GET-metode versoek dat die entiteit, net versprei ingevolge beskryf deur die voorwaardelike kop veld (s) omstandighede oorgedra word. Die voorwaardelike GET-metode is daarop gemik om onnodige netwerk te verminder deur toe te laat kas entiteite te verfris sonder dat verskeie versoeke of oordrag van data wat reeds deur die kliënt.
Die semantiek van die GET-metode verander na 'n "gedeeltelike GET" indien die versoek boodskap sluit in 'n Range kop veld. 'N Gedeeltelike AOO versoeke dat slegs 'n gedeelte van die entiteit oorgedra word, soos beskryf in artikel 14,35. Die gedeeltelike GET-metode is daarop gemik om onnodige netwerk te verminder deur toe te laat gedeeltelik-opgespoor entiteite wat voltooi moet word sonder die oordrag van data wat reeds deur die kliënt.
Die antwoord op 'n GET-versoek is cacheable as en slegs as dit voldoen aan die in artikel 13. beskryf vereistes vir HTTP caching
Sien artikel 15.1.3 vir sekuriteit oorwegings wanneer dit gebruik word vir vorms.
9.5 POST
Die POST-metode is gebruik om te versoek dat die oorsprong bediener aanvaar die entiteit ingesluit in die versoek as 'n nuwe ondergeskikte van die hulpbron word geïdentifiseer deur die Versoek-URI in die Versoek-Line. NA is ontwerp om voorsiening te maak 'n eenvormige metode om die volgende funksies te dek:
Annotation van bestaande hulpbronne;
Boodskappe stuur 'n boodskap aan 'n bord, nuusgroep, poslys, of 'n soortgelyke groep van artikels
Die verskaffing van 'n blok van data, soos die resultaat van die indiening van 'n vorm, om 'n data-hantering proses;
Die uitbreiding van 'n databasis deur 'n aanhegnavraag operasie.
Die werklike funksie wat uitgevoer word deur die POST-metode word bepaal deur die bediener en is gewoonlik afhanklik van die Versoek-URI. Die gepos entiteit is ondergeskik aan dat URI in dieselfde manier as wat 'n lêer is ondergeskikte om 'n gids wat dit, 'n nuus artikel is ondergeskik aan 'n nuusgroep waarop dit gepos is, of 'n rekord is ondergeskik aan 'ndatabasis.
Die aksie wat uitgevoer word deur die POST-metode kan nie lei tot 'n hulpbron wat uitgeken kan word aan 'n URI. In hierdie geval, óf 200 (OK) of 204 (geen inhoud) is die gepaste reaksie status, na gelang van die vraag of die reaksie sluit 'n entiteit wat beskryf die resultaat.
Die eerste belangrikste ding is die betekenis van KRY versus NA:
- Kies moet gebruik word om ... te kry ... 'n paar inligting uit die bediener,
- terwyl POST moet gebruik word om 'n paar inligting om die bediener stuur.
Daarna het 'n paar dinge wat jy kan opgemerk:
- Die gebruik van AOO, jou gebruikers kan die "terug" -knoppie gebruik in hul leser, en hulle kan boekmerk bladsye
- Daar is 'n beperking in die grootte van die parameters wat jy kan slaag as AOO (2KB vir 'n paar weergawes van Internet Explorer, as ek dit nie mis) , die limiet is veel meer vir POST, en oor die algemeen is afhanklik van opset die bediener se.
In elk geval, ek dink nie ons kan "live" sonder AOO: dink aan hoeveel URL's wat jy gebruik met parameters in die soektog string, elke dag - sonder KRY, sal almal wat nie werk nie; -)
Behalwe vir die verskil lengte beperkings in baie webblaaiers, daar is ook 'n semantiese verskil. Kry veronderstel "veilig" te wees in die sin dat hulle lees net bedrywighede wat nie die bediener staat hoef te verander. Poste sal tipies verander staat en sal waarskuwings op herindiening gee. Soekenjins 'web crawlers kan maak verwerf maar moet nooit poste maak.
Gebruik kry as jy wil om data te lees sonder om staat, en gebruik POST as jy wil staat te werk op die bediener.
My algemene reël is om te gebruik wanneer jy maak is versoeke om die bediener wat is nie van plan om staat te verander. Poste is gereserveer vir versoeke om die bediener wat staat verander.
Een praktiese verskil is dat blaaiers en webservers het'n beperking op die aantal karakters wat kan bestaan in'n URL.Dit verskil van die aansoek om aansoek, maar dit is beslis moontlik om dit te tref as wat jy het textarea
s in jou vorm.
Nog'n gotcha met Kry - hulle kry deur soekenjins geïndekseer en ander outomatiese stelsels.Google het een keer het'n produk wat sou pre-haal skakels op die bladsy wat jy lees, sodat hulle sal vinniger wees om te laai as jy kliek op die skakels.Dit veroorsaak groot verwoesting op webwerwe wat skakels soos delete.php?id=1
- mense verloor hul hele sites.
Gebruik kry wanneer jy die URL wil die toestand van die bladsy weerspieël. Dit is nuttig vir die lees van dinamiese gegenereerde bladsye, soos dié hier gesien. A POST gebruik moet word in 'n vorm om data in te dien, soos wanneer ek op die "Post Jou antwoord" knoppie. Dit produseer ook 'n skoonmaker URL aangesien dit nie 'n parameter string na die pad te genereer.
As gevolg GETs is suiwer URLs, hulle kan die kas deur die webblaaier en kan beter gebruik vir dinge soos konsekwent gegenereerde beelde wees. (Stel 'n periode)
Een voorbeeld van die Gravatar bladsy: http://www.gravatar.com/avatar / 4c3be63a4c2f539b013787725dfce802? d = monsterid
Kies mag effens beter prestasie yeild, sommige webservers skryf POST inhoud om 'n tydelike lêer voor oproep van die hanteerder.
Nog 'n ding om te oorweeg is die beperking op grootte. Kry word beperk deur die grootte van die URL, 1024 bytes deur die standaard, alhoewel blaaiers meer kan ondersteun.
meer data oordrag van as wat 'n POST moet gebruik om 'n beter leser verenigbaarheid kry.
Selfs minder as wat limiet is 'n probleem, as 'n ander plakkaat geskryf, iets in die URL kon eindig in ander dele van die Brower se UI, soos geskiedenis.
Daar is niks wat jy nie kan doen nie per-se. Die punt is dat jy nie veronderstel om te verander die bediener staat op 'n HTTP GET. HTTP gevolmagtigdes aanvaar dat sedert HTTP GET nie dan die staat verander of 'n gebruiker beroep HTTP GET een keer of 1000 keer maak geen verskil. Die gebruik van hierdie inligting wat hulle veronderstel dit veilig is om 'n cached weergawe van die eerste HTTP GET terugkeer. As jy die HTTP spesifikasie breek jy die risiko breaking HTTP kliënt en gevolmagtigdes in die natuur. Moet dit nie doen:)
Dit deurkruis in die konsep van rus en hoe die web is kinda bedoel op gebruik. Daar is 'n uitstekende podcast op Software Engineering radio dat 'n in diepte gesprek oor die gebruik van gee Kry en Post.
kry, is gebruik om data van die bediener, waar 'n update aksie nie moet nodig wees trek. Die idee is dat jy moet in staat wees om dieselfde GET-versoek oor en oor gebruik en het dieselfde inligting teruggekeer. Die URL het die kry inligting in die soektog string, omdat dit veronderstel was om in staat wees om maklik gestuur word na ander stelsels en mense soos 'n adres op waar om iets te vind.
Post is veronderstel om gebruik te word (ten minste deur die res argitektuur wat die web kinda is gebaseer op) vir stoot inligting aan die bediener / vertel van die bediener na 'n aksie uit te voer. Voorbeelde soos: Werk hierdie data, skep hierdie rekord.
1.3 Quick Kontrolelys vir keuse van HTTP GET
of POST
Gebruik kry as:
The interaction is more like a question (i.e., it is a safe operation such as a query, read operation, or lookup).
Gebruik POST as:
The interaction is more like an order, or
The interaction changes the state of the resource in a way that the user would perceive (e.g., a subscription to a service), or
The user be held accountable for the results of the interaction.
Bron .
i dont sien 'n probleem met behulp van kry al is, ek gebruik dit vir 'n eenvoudige dinge waar dit sinvol om dinge op die navraag string te hou.
Deur dit te gebruik om die staat te werk - soos 'n GET van delete.php?id=5
om 'n bladsy verwyder - is baie riskant. Mense het bevind dat wanneer web Google se versneller begin voorafhaal URLs op bladsye - dit druk al die 'delete' links en uitgewis data mense se. Dieselfde kan gebeur met soekenjins.
POST kan groot data beweeg terwyl AOO kan nie.
Maar oor die algemeen is dit nie oor 'n shortcomming van AOO, eerder 'n konvensie as jy wil om jou webwerf / webapp mooi te gedra.
Het jy 'n blik op http://www.w3.org/2001 /tag/doc/whenToUseGet.html
Van RFC 2616 :
9.3
Die GET-metode beteken haal enige inligting (in die vorm van 'n entiteit) is geïdentifiseer deur die Versoek-URI. Indien die versoek-URI verwys 'n-data vervaardiging proses, dit is die geproduseer data wat sal teruggestuur word as die entiteit in die reaksie en nie die bronteks van die proses, tensy wat teks gebeur met die produksie van wees die proses.
9.5 Stuur
die pos metode word gebruik om te versoek dat die oorsprong bediener aanvaar die entiteit ingesluit in die versoek as 'n nuwe ondergeskikte van die resource geïdentifiseer deur die Versoek-URI in die Versoek-Line. NA is ontwerp om voorsiening te maak 'n eenvormige metode om die dek volgende funksies:
- Annotation van bestaande hulpbronne;
- Plaas 'n boodskap aan 'n bord, nuusgroep, poslys, of soortgelyke groep van artikels
- Die verskaffing van 'n blok van data, soos die resultaat van die indiening van 'n vorm, 'n data-hantering proses;
- Die uitbreiding van 'n databasis deur 'n aanhegnavraag operasie.
Die werklike funksie wat uitgevoer word deur die POST-metode word bepaal deur die bediener en is gewoonlik afhanklik van die Versoek-URI. Die gepos entiteit is ondergeskik aan dat URI in dieselfde manier dat 'n lêer is ondergeskik aan 'n gids waarin dit voorkom, 'n nuus artikel is ondergeskik aan 'n nuwe groep waaraan dit gepos, of 'n rekord ondergeskik aan 'n databasis.
Die aksie wat uitgevoer word deur die POST metode kan nie lei tot 'n hulpbron wat geïdentifiseer kan word deur 'n URI. in hierdie geval, óf 200 (OK) of 204 (Geen Inhoud) is die gepaste reaksie status, afhangende van of die reaksie sluit 'n entiteit wat beskryf die resultaat.
Ek gebruik POST as ek nie wil hê mense moet die soektog string sien of wanneer die soektog string kry groot. Ook POST word benodig vir lêers wat gelaai is.
Ek het nie 'n probleem sien met behulp van KRY al is, gebruik ek dit vir eenvoudige dinge waar dit sinvol om dinge op die soektog string te hou.
Die gebruik van AOO sal toelaat skakel na 'n spesifieke bladsy moontlik te waar POST nie sou werk nie.
Eenvoudige weergawe van die post gesit word DELETE
- gebruik te kry - as jy wil enige hulpbron soos Lys van data wat gebaseer is op enige id of Naam kry
- gebruik POST - wanneer jy wil enige data te server stuur. Hou ook in gedagte pos is swaar gewig werking as gevolg van updation ons moet eerder gebruik geneem van post intern pos sal nuwe hulpbron te skep
- gebruik geneem - wanneer jy
Die oorspronklike bedoeling was dat AOO is gebruik vir die kry van data terug en post was om enigiets wees. Die reël wat ek gebruik, is dat as ek iets terug is stuur na die bediener, gebruik ek pos. As ek net 'n beroep 'n URL om terug te kry data, ek gebruik AOO.
Lees die artikel oor HTTP in die Wikipedia . Dit sal verduidelik wat die protokol is en wat dit doen:
Versoeke 'n voorstelling van die gespesifiseerde hulpbron. Let daarop dat AOO moet nie gebruik word vir operasies wat newe-effekte, soos die gebruik van dit vir die neem van aksies in web aansoeke veroorsaak. Een van die redes hiervoor is dat AOO arbitrêr mag gebruik word deur robotte of crawlers, wat nie nodig sal hê om die newe-effekte wat 'n versoek moet veroorsaak oorweeg.
en
Stuur Voorlê data te verwerk (bv van 'n HTML-vorm) om die geïdentifiseerde hulpbron. Die data is opgeneem in die liggaam van die versoek. Dit kan lei tot die skepping van 'n nuwe hulpbron of die updates van bestaande hulpbronne of beide.
Die W3C het 'n dokument genaamd URIs, Addressability, en die gebruik van HTTP KRY en post wat verduidelik wanneer om watter te gebruik. Met verwysing na
1.3 Quick Kontrolelys vir keuse van HTTP GET of POST
- Gebruik kry as:
- Die interaksie is meer soos 'n vraag (dit wil sê, dit is 'n veilige werking soos 'n navraag, lees operasie, of lookup).
en
- Gebruik POST as:
- Die interaksie is meer soos 'n bevel, of
- Die interaksie verander die staat van die hulpbron in 'n manier dat die gebruiker sal sien (bv 'n inskrywing op 'n diens), of o Die gebruiker verantwoordelik vir die resultate van die interaksie gehou word.
Maar, voordat die finale besluit om te gebruik HTTP GET of POST asseblief ook oorweeg oorwegings vir sensitiewe data en praktiese oorwegings.
'n Praktiese voorbeeld sou wees wanneer jy 'n HTML-vorm in te dien. Jy spesifiseer óf post of kry vir die vorm aksie. PHP sal vul $ _GET en $ _POST dienooreenkomstig.
In PHP, POST
datalimiet word gewoonlik deur jou php.ini
stel. GET
is beperk deur bediener / leser instellings ek glo -. gewoonlik rondom 255
grepe
Van w3schools.com :
Wat is HTTP?
Die HyperText Transfer Protocol (HTTP) is ontwerp om te aktiveer kommunikasie tussen kliënte en bedieners.
HTTP werk as 'n versoek-reaksie protokol tussen 'n kliënt en bediener.
'n webblaaier mag die kliënt, en 'n aansoek op 'n rekenaar wees wat gashere 'n webwerf kan die bediener wees.
Voorbeeld: 'n kliënt (browser) lê 'n HTTP versoek om die bediener; dan die bediener gee 'n reaksie op die kliënt. die reaksie bevat status inligting oor die versoek en kan ook bevat die versoek inhoud.
Twee metodes HTTP Versoek: KRY en post
Twee algemene metodes om 'n versoek-reaksie tussen 'n kliënt en bediener is:. KRY en post
te kry - Versoeke data uit 'n bepaalde bron POST - voorlê data te verwerk tot 'n bepaalde bron
Hier het ons onderskei die groot verskille:
Wel een groot ding is iets wat jy oor GET
gaan word blootgestel via die URL in te dien. In die tweede plek as Ceejayoz sê, daar is 'n beperking op karakters vir 'n URL.
Nog 'n verskil is dat POST vereis oor die algemeen twee HTTP bedrywighede, terwyl kry net vereis een.
Edit: Ek moet verduidelik - vir 'n gemeenskaplike ontwikkeling patrone. Oor die algemeen reageer op 'n pos met 'n regop HTML webblad is 'n twyfelagtige ontwerp vir 'n verskeidenheid van redes, waarvan een is die irriterende "moet jy hierdie vorm weer in te dien, doen wat jy wil om dit te doen?" op te druk op die terug knoppie.
As beantwoord word deur ander, daar is 'n beperking op url grootte met te kry, en lêers kan met net post ingedien word.
Ek wil graag dat 'n mens voeg kan dinge toe te voeg tot 'n databasis met 'n get en uit te voer aksies met 'n post. Wanneer 'n script 'n pos of 'n get ontvang, kan dit doen wat die skrywer wil om dit te doen. Ek glo die gebrek aan begrip is afkomstig van die bewoording van die boek gekies het of hoe jy dit lees.
'n script skrywer moet gebruik poste aan die databasis te verander en te gebruik kry net vir herwinning van inligting.
Scripting taal verskaf baie middele waarmee toegang tot die versoek. Byvoorbeeld, PHP laat die gebruik van $_REQUEST
om óf 'n pos of 'n get te haal. 'N Mens moet hierdie ten gunste van die meer spesifieke $_GET
of $_POST
vermy.
In web ontwikkeling, daar is 'n baie meer ruimte vir interpretasie. Daar is wat 'n mens moet en wat 'n mens kan doen, maar watter een is beter is dikwels vir debat. Gelukkig, in hierdie geval, daar is geen dubbelsinnigheid. Jy moet gebruik poste om data te verander, en jy moet Gebruik kry om inligting te herwin.
Gorgapor, mod_rewrite
nog gebruik dikwels GET
. Dit laat net 'n vriendeliker URL vertaal in 'n URL met 'n GET
navraag string.
HTTP Post data het nie 'n gespesifiseerde limiet op die bedrag van data, waar as verskillende blaaiers het verskillende grense vir AOO se. Die RFC 2068 lui soos volg:
Servers moet versigtig wees oor afhangende van URI lengtes bo 255 grepe, want 'n paar ouer kliënt of proxy implementering kan nie behoorlik ondersteun hierdie lengtes
spesifiek jy moet die reg HTTP konstrukte vir wat hulle gebruik vir. HTTP GET se moet nie newe-effekte hê en veilig kan verfris en gestoor deur HTTP Volmagte, ens.
HTTP POST se gebruik wanneer jy wil data teen 'n url hulpbron te dien.
'n Tipiese voorbeeld vir die gebruik van HTTP GET is op 'n Search, maw Soek? Query = my + navraag 'N Tipiese voorbeeld vir die gebruik van 'n HTTP POST is die indiening van terugvoer om 'n aanlyn vorm.