GET en POST requests
Een browser (of jij, met php of telnet, o.i.d.) kan twee soorten HTTP requests maken: GET en POST.
Even voor de duidelijkheid: ELKE pagina die je opent is het resultaat van een GET of POST request. We kennen allemaal wat een POST request doet. Of toch niet!? Een form heeft twee "methods": GET of POST :) We gebruiken method POST om 'grote' hoeveelheden data met een form te versturen. Wat we eigenlijk doen dan, is een POST request maken, met een aantal parameters.
Wanneer we een GET request maken, zonder parameters, openen we gewoon een pagina. Als je naar www.google.nl surft maak je een GET request zonder parameters.
een GET request
De eerste regel van een HTTP request is de methode, de http versie en de locatie. Een voorbeeld:
Ziet er makkelijk uit he :) Maar wat gebeurt er!? Duidelijk... een GET request naar /. Dat is vaak index.php, maar dat is nog niet interessant.
Een request moet, net zoals een response, bestaan uit een status regel en een aantal headers. Een voorbeeld :)
2
3
4
5
Host: www.jouwmoeder.nl
Content-Type: application/x-www-form-urlencoded
Content-Length: 3
Connection: Close
Zoals je ziet is er een header Content-Length. Die zegt hoeveel data er wordt verstuurd. Als je een GET request maakt is dit niet nodig.
Omdat er 3 bytes verstuurd worden volgens ons, moeten we iets verzinnen ;)
Een voorveeld "data blok" zou kunnen zijn:
Dit ontvang je in external_socket.php als $_POST['c']. Zo makkelijk is het.
Als meerdere variabelen wil sturen moet je die scheiden met een ampersand (&). Denk er aan om altijd je waarden te urlencoden! Maar alleen je waarden! Niet de var namen. Bijvoorbeeld:
Nu gaan we nog even snel een request sturen en data ontvangen :)
Ik gebruik als server "www.jouwmoeder.nl" en als script "/external_socket.php"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$server = "www.jouwmoeder.nl";
$script = "/external_socket.php";
// Maak socket - ik ga er van uit dat het lukt, dus geen error afhandeling :)
$sock = fsockopen($server, 80);
if ( $sock )
{
$szParams = "user=rudie&pass=" . urlencode("mijn wachtwoord");
$headers = "POST ".$script." HTTP/1.1\r\n";
$headers.= "Content-Type: application/x-www-form-urlencoded\r\n";
$headers.= "Content-Length: ".strlen($szParams)."\r\n";
$headers.= "Connection: Close";
$headers.= "\r\n"; // met een extra 'open regel' maken we http duidelijk dat de headers afgelopen zijn
// En nu http headers naar de server schrijven
fwrite($sock, $headers);
fwrite($sock, $szParams);
// En minstens zo belangrijk, headers (en meer) ophalen en opslaan
$output = "";
while ( !feof($sock) )
{
$output .= fread($sock, 4096);
}
// $output bestaat nu uit twee onderdelen: Headers en Data
// Om uit elkaar te houden: headers is TOT de eerste open regel, dus \r\n\r\n
list($headers, $body) = explode("\r\n\r\n", $output, 2);
// Maar we printen even alles voor de duidelijkheid
echo $output;
}
?>
Als ik dat probeer zal mijn venster dit printen:
HTTP/1.1 200 OK
Date: Mon, 16 Oct 2006 20:11:39 GMT
Server: Apache/2.0.54 (Debian GNU/Linux) FrontPage/5.0.2.2635 mod_python/3.1.3 Python/2.3.5 PHP/4.4.1-0.dotdeb.3 mod_ssl/2.0.54 OpenSSL/0.9.7e mod_perl/1.999.21 Perl/v5.8.4
X-Powered-By: PHP/4.4.1-0.dotdeb.3
secret1: geheime shit
secret2: Array();\n!scalar
secret1: meer geheimes
Content-Length: 96
Connection: close
Content-Type: text/plain
METHOD: POST
GET:
Array
(
)
POST:
Array
(
[user] => rudie
[pass] => mijn wachtwoord
)
Inhoudsopgave
- De functies
- HTTP Requests! Nieuw?
- GET en POST requests
- Duidelijkheid en verwerking
- secrets in http headers
- Afsluiting
- request
- request
- response
- response