Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Sivun hakeminen POSTin ja keksien kanssa

sooda [22.01.2005 20:04:57]

#

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]"; ?>

T.M. [22.01.2005 21:32:30]

#

lainaus:

echo "lolts $sivu";

hmm... Mikäköhän merkitys tuolla mahtaa olla :)

sooda [22.01.2005 21:34:48]

#

Oho. Kiitti T.M. :D jäi testausvaiheessa siihen. En huomannut ottaa pois :) Nyt se on vek.

Pyry [24.01.2005 18:26:15]

#

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).

sooda [25.01.2005 12:20:08]

#

Lisäsin useragentin ja korjasin ton $host -> $servu.

akx [25.01.2005 16:47:06]

#

Vaihtoehtoisesti sitten tietenkin libcurl.

Metabolix [10.12.2011 01:46:00]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta