Hakee sivun netistä välittäen sille myös jopa POSTdataa ja keksejä. GET-datat toimii tietty myös.
Tiedot kannattaa urlencodettaa. Itelläni ku testasin niin "kaks=jee yks kaks kol" toimi kyllä. Varmuuden vuoksi laittasin tiedot kuitenkin urlencode():n läpi.
Headereihin voi siis itekin lisätä kaikenlaista esim refereriä ym. heittämällä tohon servulle lähetettävään stringiin ne oikeaan kohtaan.
Palauttaa koko http-vastauksen, eli sivun ja sitä ennen servun http-headerit (?)
<?
function hae_sivu($urli, $tieto, $keksit) {
$parsetus = parse_url($urli);
$servu = $parsetus["host"]; // server itse
$sivu = $parsetus["path"];
/* olisi helpompi tehdä antamalla funkkarille parametreinä erikseen serveri
ja haettava urli, mutta tämä tapa on käyttäjäystävällisempi :) */
if ($parsetus["query"]) $sivu .= "?$parsetus[query]";
if ($parsetus["fragment"]) $sivu .= "#$parsetus[fragment]";
$pituus = strlen($tieto);
$yhteys = fsockopen($servu, 80); // avataan yhteys serveriin
// heitetään servulle ihan perus http-sivupyyntö
fputs($yhteys, "POST $sivu HTTP/1.1\r\n" . // huomaa: POST eikä GET
"Host: $servu\r\n" .
// sisältötyyppinä url-enkoodattu lomaketieto
"Content-Type: application/x-www-form-urlencoded\r\n" .
// lomaketiedon pituus pitää kertoa
"Content-Length: $pituus\r\n" .
"User-Agent: PHP\r\n" .
"Cookie: $keksit\r\n" .
"Connection: Close\r\n\r\n$tieto");
// haetaan sivun sisältö. 30 on jostain syystä nopea pufferin koko tässä
while (!feof($yhteys)) $vastaus .= fgets($yhteys, 30);
fclose($yhteys); // yhteys kii
return $vastaus;
}
// käyttöesimerkki. tällä testasin että toimii. heitä tää menemään :)
echo hae_sivu("http://localhost/~sooda/foo/postdata2.php?yks=111", "kaks=222", "kol=333");
?>tällä testasin että varmaan toimii
<?php echo "$_GET[yks]foo$_POST[kaks]foo$_COOKIE[kol]"; ?>
lainaus:
echo "lolts $sivu";
hmm... Mikäköhän merkitys tuolla mahtaa olla :)
Oho. Kiitti T.M. :D jäi testausvaiheessa siihen. En huomannut ottaa pois :) Nyt se on vek.
Ihan hieno, tosin voisit käyttää koodissasi tyhjiä rivinvaihtoja selkeyttämään sitä. Lisäksi itselläni tuli ainakin seuraavat huomautukset:
lainaus:
Notice: Undefined index: fragment in ./http_test.php on line 10
Notice: Undefined variable: host in ./http_test.php on line 15
Notice: Undefined variable: vastaus in ./http_test.php on line 23
Ainiin... voisit laittaa vielä User-Agent -kohdan headereihin, sillä jotkin palvelimet vaativat sen ehdottomasti (kuten omani).
Lisäsin useragentin ja korjasin ton $host -> $servu.
Vaihtoehtoisesti sitten tietenkin libcurl.
HTTP-otsikoita voi lisätä myös file_get_contents-funktiolle (ks. stream_context_create), ja vastauksen otsikot löytyvät sen jälkeen muuttujasta $http_response_header.
Aihe on jo aika vanha, joten et voi enää vastata siihen.