Vad är egentligen skillnaden mellan POST och GET-data? Vad jag har fattat så är GET-variabler något som man bara kan skapa genom att skriva in dem i adressen man ska till, medan POST bara är något man kan skicka med knappar, textrutor och kryssrutor? Kan man inte skicka data som varken syns i adressen eller som man måste skriva in i en textbox?
Skillnad mellan POST- och GET-data
22 svar · 4 592 visningar · startad av TriKri
GET data ger resultatet i en Querestring ja... Vilket kan vara "dåligt" då man inte kan ha hur långa adresser som hellst ;)
Man kan skicka "gömd" data genom att använda input type=hidden.
Men den stora skillnaden är att man kan skicka betydligt mera info med post.
Information från knappar, textrutor och kryssrutor kan skickas både som GET och POST. Du anger vilket du vill använda i form-taggen:
<form method="post" action="?">
<form method="get" action="?">
Storleksbegränsningen på GET är inte enda nackdelen. Eftersom det är en del av webbadressen så hamnar den ju i loggfiler, bokmärken och liknande ställen.
Om jag inte minns fel anger väl HTTP-specen inte nån gräns för GET utan det är webbläsarna som sätter den. IE är snålast har jag för mig, med sina 2048 tecken inkl. själva resursen.
Men det är väl skitsamma vad specen säger egentligen eftersom majoriteten fortfarande använder IE. POST erbjuder som sagt större möjligheter att skicka mkt info och det utan någe strul mellan de olika webbläsarna.
Det är många skillnader mellan GET och POST, men den mest märkbara (för utvecklare) är att man kan skicka med binärfiler med POST. Utöver det är namnen i sig mer uppenbara än vad man kan tro vad gäller syftet med de två metoderna.
GET: Hämta saker
POST: Lagra saker
Kortfattat: Du kan ladda upp filer till webbservern genom POST men inte genom GET.
Hmm...
http://tomayko.com/articles/2004/12/12/rest-to-my-wife beskriver skillnaderna på ett trevligt och underhållande sätt.
[Resten borttaget]
jarvklo skrev:
Rent tekniskt handlar det i princip mest om att datat läggs som namn-värde-par i olika delar av HTTP-headern som medföljer varje sidbegäran + att man kan skicka med binärdata vid POST (som beskrivs ovan).
GET ligger i HTTP-headern, men inte POST som i stället ligger i bodyn.
Man kan skicka binärdata med GET, dock inte så mycket - som vi varit inne på tidigare - men ändå. Det man inte kan är att innehållsdeklarera det, så webbservern måste veta vad det är för sorts data som kommer.
Förlåt. Jag menade inget illa. Ibland är det jag som inte har stenkoll på läget och då rättar någon mig. Det är ju så det fungerar på ett forum, att man kompletterar varandra. Men jag vet ju också hur det känns när man gjort en lång utläggning och bara får klagomål i stället för tack.
jarvklo,
Redigera in inlägget igen! Jag läste igenom det som hastigast igår natt men orkade inte svara eftersom det var sent och jag egentligen skulle sova. Det fanns ju ett gäng bra punkter som inte redan nämnts, in med dem! Seså, do it. (y)
tydal skrev:
GET ligger i HTTP-headern, men inte POST som i stället ligger i bodyn.
URL:en är väl inte direkt en header.
Request-headers är ju t.ex.:
GET / HTTP/1.1
Accept: */*
Accept-Language: sv-SE,en-US;q=0.5
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1)
Host: https://www.webforum.nu
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cookie: ...
tydal skrev:
GET ligger i HTTP-headern, men inte POST som i stället ligger i bodyn.
Nja, GET ligger i URL'en medans POST ligger i headern.
Erik Juhlin skrev:
Request-headers är ju t.ex.:
På första raden i ditt exempel har du ju GET-variablerna. I ditt exempel har du inga, men hade du haft hadet det kunnat se ut så här:
GET /test.php?variabel1=varde1&variabel2=varde2 HTTP/1.1
GunnarD skrev:
Nja, GET ligger i URL'en medans POST ligger i headern.
Jag gör väl en utläggning jag då...
Vi börjar med http://www.webforum.nu/index.php?threads=40
http talar om att vi ska använda http-protokollet.
www.webforum.nu talar om vilken server som ska anropas.
/index.php?threads=40 talar om vilken sida vi ska begära.
Först så måste vi veta vilken adress servern har som vi ska kontakta, så vi tar fram A-record för www.webforum i DNS:en:
www.webforum.nu canonical name = wf1.webforum.nu.
Name: wf1.webforum.nu
Address: 193.13.74.84
Okej, så servern heter egentligen wf1.webforum.nu, men det intressanta i sammanhanget är att adressen är 193.13.74.84 för då har vi en server att kontakta...
Vi kontaktar 193.13.74.84 på port 80 (standard för http) och något vaknar i andra änden och vi kan skicka vår begäran om att få se sidan.
GET /index.php?threads=40 HTTP/1.1
Host: www.webforum.nu
Det är allt, med GET så skickar man bara en header. Men sen får vi ett svar tillbaka från webforum, och det innehåller både en header och en body. Headern slutar med en tomrad och därefter börjar bodyn. Men för att veta när bodyn slutar så måste man tala om längden på den i headern. Så här ser svaret ut:
HTTP/1.1 200 OK
Connection: close
Date: Thu, 12 Jul 2007 12:45:37 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: PHP/4.3.6
Set-Cookie: bbsessionhash=25232de2f7b25ee4e3145e6035b6f92b; path=/; domain=www.webforum.nu
Set-Cookie: bblastvisit=1184244336; expires=Fri, 11-Jul-2008 12:45:36 GMT; path=/; domain=www.webforum.nu
Set-Cookie: bblastactivity=1184244336; expires=Fri, 11-Jul-2008 12:45:36 GMT; path=/; domain=www.webforum.nu
Expires: 0
Cache-Control: private, post-check=0, pre-check=0, max-age=0
Pragma: no-cache
Content-Type: text/html; charset=ISO-8859-1
Content-Length: 104667
Notera några saker som är intressanta...
Set-Cookie, det är så en cookie skapas. Webbservern skickar med den i headern och nu är det upp till webbläsaren att komma ihåg den och vid alla följande requests lägga med den i headern ("Cookie:").
Content-Type, det är innehållsdeklarationen som talar om vad bodyn innehåller för slags data. Det är det som styr vad webbläsaren ska göra, om den ska visas det själv, om den ska använda ett plugin eller om den ska spara det som fil.
Content-Length är hur många bytes som bodyn är på, i det här fallet alltså html-sidan vi får som svar (index.php).
Det var GET och svaret på det, men om nu går över till POST, vilket till exempel används när man skriver ett inlägg...
Då är URL:en http://www.webforum.nu/newreply.php
POST /newreply.php HTTP/1.1
Host: www.webforum.nu
Inledningen ser nästan likadan ut (man kan skicka med "GET-variabler" här också om man vill) men sen måste vi lägga till några ytterligare headerrader:
Content-Type: application/x-www-form-urlencoded
Content-Length:
Content-Typen anger att det är ett urlkodad formulärdata vi ska skicka, och så måste vi ha antalet bytes på Content-Length. Sedan måste vi också ha med vår cookie som talar om vem vi är inloggade som, annars kommer inte inlägget att accepteras.
Men därefter kommer en tomrad och så börjar bodyn som innehåller datat vi ska POST:a...
do=postreply&s=&t=158652p=1333913&title=&message=Hello+World
Det kompletta meddelandet blir alltså:
POST /newreply.php HTTP/1.1
Host: www.webforum.nu
Cookie: Den-inloggades-cookie
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
do=postreply&s=&t=158652p=1333913&title=&message=Hello+World
Först har vi alltså header, sen en tomrad och därefter bodyn. Observera att jag bara har visat ett utdrag av de variabler som är med i postdatat.
Du har rätt. Jag som fick för mig. Testade en GET request, men ett ganska dåligt test var det ju... :)
Tydal: är med på det, men det jag menade med att GET ligger i URL'en och POST i header är att i GET fallet så skickas det med i själva frågeraden (GET raden i header) medans i POST fallet ligger den i header (utanför frågeraden).
Så om man tar ditt exempel så blir det ungefär så här:
GET
GET /newreply.php?do=postreply&s=&t=158652p=1333913&title=&message=Hello+World HTTP/1.1
Host: [url]www.webforum.nu[/url]
Cookie: Den-inloggades-cookie
Eller samma varian med POST
POST /newreply.php HTTP/1.1
Host: [url]www.webforum.nu[/url]
Cookie: Den-inloggades-cookie
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
do=postreply&s=&t=158652p=1333913&title=&message=Hello+World
GunnarD skrev:
Tydal: är med på det, men det jag menade med att GET ligger i URL'en och POST i header är att i GET fallet så skickas det med i själva frågeraden (GET raden i header) medans i POST fallet ligger den i header (utanför frågeraden).
Om du är med på att postdata inte ligger i headern så tycker jag det är ett märkligt sätt att uttrycka sig.
Möjligt men se exemplena så förstår du hur jag menar. ;)
dAEk skrev:
Redigera in inlägget igen! [...] Det fanns ju ett gäng bra punkter som inte redan nämnts, in med dem! Seså, do it.
OK. Om herrar petimetrar slagits färdigt om huruvida det som står före eller efter den där blankraden i den "textfil" som skickas från klient till server är en "header" eller en "body" så kan jag väl göra det antar jag ;) (det jag nu kommer ihåg av det jag skrev i den nattliga stundens ingivelse)
TriKri skrev:
Vad är egentligen skillnaden mellan POST och GET-data?
Som jag ser det:
Det man gör oavsett metod är att överföra namn-värdepar. Hur man än gör, lägs dessa i "klartext" (eller iallafall bara enklare "enkodat") i den "text" som förs över vid sidbegäran (det är den textens principer, dvs vad som är vad i ett HTTP-anrop - som diskuterats i hög detaljgrad här ovan i tråden).
Hursomhelst
Tre uppenbara sätt faller ut ganska omedelbums (se t.ex. länken i mitt första inlägg i tråden):
* GET - I URL.
* POST - i den "text" som skickas med sidbegäran
* i Cookies - dvs i en annan del av den "text" som skickas med vid sidbegäran (men här krävs i allmänhet lite fiffig script för att få in informationen i Cookien)
Man kan också, som påpekats tidigare i tråden, kombinera de tre och lägga sina namn-värdepar lite här och var efter tycke, smak och önskad effekt ;)
Just GET lämpar sig i allmänhet antagligen sämre för att använda om du skall bygga kommandosystem/webbapplikationer med krav på säkerhet eftersom allt data (inklusive ev. sessionsID:n, AnvändarID:n eller lösenord) ligger i URL:en - vilket öppnar för oavsiktliga missar och mindre önskvärda effekter om man inte ser upp...
Antag t.ex. att ett reklambrev från ditt webbhotell innehåller en personlig länk till din "kontrollpanel" på formen
http://example.se/login.aspx?userid=jarvklo&password=MySecretPassword
, men att den bara förekommer såhär:
Gå till din kontrollpanel
Antag nu att du vill rekommendera dem och att du vidarebefordrar reklambrevet till en polare...
Think about it! ;)
Antag också att du byggt en WIKI och att du använder GET för alla kommandon (inkuslive http://example.se?page=apage&command=delete) och att Googles webbspindel får fatt i den webbplatsen... Oops!
TriKri skrev:
Kan man inte skicka data som varken syns i adressen eller som man måste skriva in i en textbox?
Jodå, med lite fiffig Javascript kan man skicka saker till och från en Applet som i sin tur kommunicerar med din server. En metod liknande den används t.ex. för BankID (även om man där antagligen tar steget fullt ut och låter appleten innehålla inmatningsfältet - jag har inte detaljanalyserat just den tjänsten ;) )...
Men man kan också använda t.ex. XMLHttp (dvs i princip det som i dagligt tal kallas AJAX) för att skicka (XML-formaterad) data som aldrig förekommer i webbsidans adressfält eller i någon textbox på sidan.