Bekijk Volledige Versie : POST vanuit PHP
Sander Ros
22/12/03, 19:00
Vraagje,
Vanuit PHP kan ik een ander script aanroepen met variabelen volgens de
GET-methode op de volgende manier:
<?php
$fp = fsockopen ("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br>\n";
} else {
fputs ($fp, "GET /page.php?a=b HTTP/1.0\r\nHost:
www.example.com\r\n\r\n");
while (!feof($fp)) {
echo fgets ($fp,128);
}
fclose ($fp);
}
?>
Hoe kan ik dezelfde pagina opvragen volgens de POST-methode, en hoe
specificeer ik dan de variabelen? Bijkomende vraag is dan meteen, hoe zorg
ik dat de meegestuurde headers die ik terug krijg worden gescheiden van de
inhoud van de pagina.
Ik ben al enkele weken naar de oplossing op zoek, maar kan deze nog niet
vinden. Ook als iemand een voorbeeld script weet, waaruit ik zelf de
oplossing kan halen is dit welkom.
Alvast bedankt,
Sander Ros
--
Ik lurk nu alweer enige tijd mee vanuit Dialog, wat een geweldige
newsreader!
Daniel Tryba
22/12/03, 19:15
Sander Ros <sanderros@cistron.nl> wrote:
> Hoe kan ik dezelfde pagina opvragen volgens de POST-methode, en hoe
> specificeer ik dan de variabelen?
Hoe je dat doet staat beschreven in rfc 2616 IIRC.
> Bijkomende vraag is dan meteen, hoe zorg
> ik dat de meegestuurde headers die ik terug krijg worden gescheiden van de
> inhoud van de pagina.
Ook dat staat in de zelfde rfc (de eerste lege regel is de seperator
tussen content en headers).
> Ik ben al enkele weken naar de oplossing op zoek, maar kan deze nog niet
> vinden.
Waarop/hoe zoek je dan? Ik had binnen 1 poging al een relevante link
gevonden. Wellicht dat het tijd is voor een cursus "hoe vind ik wat ik
zoek?"?
> Ook als iemand een voorbeeld script weet, waaruit ik zelf de
> oplossing kan halen is dit welkom.
Zoek op mijn naam, post tussen 2002-12-01 en 2003-01-01 in het google
nieuws archief en je zult een voorbeeld vinden. Niet perfect maar moet
voldoende zijn om je het goed pad op te helpen.
--
Daniel Tryba
Maarten Wierda
22/12/03, 19:30
Daniel Tryba wrote:
> Waarop/hoe zoek je dan? Ik had binnen 1 poging al een relevante link
> gevonden. Wellicht dat het tijd is voor een cursus "hoe vind ik wat ik
> zoek?"?
Waar kan ik die volgen? :)
--
Cheers, Maarten Wierda
"Meeting Again For The First Time"
PTW/YCBYG
Daniel Tryba
22/12/03, 19:45
Maarten Wierda <moart3nAT@chello.nl> wrote:
>> Waarop/hoe zoek je dan? Ik had binnen 1 poging al een relevante link
>> gevonden. Wellicht dat het tijd is voor een cursus "hoe vind ik wat ik
>> zoek?"?
>
> Waar kan ik die volgen? :)
Geen idee, nog niet gevonden. Ik verwacht een verlossend antwoord van
Rene (en snel en beetje (voor de kerst aub)).
--
Daniel Tryba
Sander Ros
22/12/03, 19:45
On Mon, 22 Dec 2003 18:10:23 +0000 (UTC), Daniel Tryba wrote:
> Sander Ros wrote:
>> Hoe kan ik dezelfde pagina opvragen volgens de POST-methode, en hoe
>> specificeer ik dan de variabelen?
> Hoe je dat doet staat beschreven in rfc 2616 IIRC.
<KNIP>
> Wellicht dat het tijd is voor een cursus "hoe vind ik wat ik
> zoek?"?
Sorry, 8313 regels RFC is mij net iets te veel van het goede, zeker als ik
daarna ook nog moet uitvogelen hoe ik dat in PHP moet implementeren. Is
toch al gauw weer anderhalf jaar geleden dat ik er iets zinnigs mee heb
gedaan, dus ik was al blij dat ik 'fsockopen' had gevonden. Ook op
php.resourceindex.com kon ik geen fatsoenlijk voorbeeldscript vinden.
> Zoek op mijn naam, post tussen 2002-12-01 en 2003-01-01 in het google
> nieuws archief en je zult een voorbeeld vinden. Niet perfect maar moet
> voldoende zijn om je het goed pad op te helpen.
Ongeveer 106 posts gevonden, ik zal eens kijken.
Bedankt,
Sander Ros
Rene Pijlman
22/12/03, 20:15
Daniel Tryba:
>Maarten Wierda:
>>> Wellicht dat het tijd is voor een cursus "hoe vind ik wat ik zoek?"?
>>
>> Waar kan ik die volgen? :)
>
>Geen idee, nog niet gevonden. Ik verwacht een verlossend antwoord van
>Rene (en snel en beetje
http://www.leren.nl/rubriek/computers_en_internet/internetten/zoeken_op_het_web/
--
René Pijlman
"Moet ik nog geëerd zijn om het feit dat ze mijn body willen hebben, omdat
ze het zelf niet kunnen maken ..?"
- RR in niwo
Daniel Tryba
22/12/03, 20:15
Sander Ros <sanderros@cistron.nl> wrote:
>> Hoe je dat doet staat beschreven in rfc 2616 IIRC.
>
> Sorry, 8313 regels RFC is mij net iets te veel van het goede, zeker als ik
> daarna ook nog moet uitvogelen hoe ik dat in PHP moet implementeren.
Het is echter de enige autoriteit op het gebied van http proctol
geleuter.
> Is toch al gauw weer anderhalf jaar geleden dat ik er iets zinnigs mee
> heb gedaan, dus ik was al blij dat ik 'fsockopen' had gevonden. Ook op
> php.resourceindex.com kon ik geen fatsoenlijk voorbeeldscript vinden.
Hmmm, kijk eens naar PEAR of zoek naar snoopy, in PEAR zit IIRC ergens
een httpclient en snoopy is een classes die jij zoekt (IIRC).
>> Zoek op mijn naam, post tussen 2002-12-01 en 2003-01-01 in het google
>> nieuws archief en je zult een voorbeeld vinden. Niet perfect maar moet
>> voldoende zijn om je het goed pad op te helpen.
>
> Ongeveer 106 posts gevonden, ik zal eens kijken.
Huh! Volgens mij zijn het er maar 4 (het is de yyy-mm-dd notatie).
--
Daniel Tryba
Sander Ros
22/12/03, 20:30
On Mon, 22 Dec 2003 20:01:19 +0100, Rene Pijlman wrote:
> Daniel Tryba:
>>Maarten Wierda:
>>>> Wellicht dat het tijd is voor een cursus "hoe vind ik wat ik zoek?"?
>>> Waar kan ik die volgen? :)
>>Geen idee, nog niet gevonden. Ik verwacht een verlossend antwoord van
>>Rene (en snel en beetje
> http://www.leren.nl/rubriek/computers_en_internet/internetten/zoeken_op_het_web/
Hmmm, net op die pagina CTRL-F "Google" gedaan, maar niets gevonden. Wat
doe ik fout ;-)
Gegroet,
Sander Ros
Sander Ros
22/12/03, 20:30
On Mon, 22 Dec 2003 18:10:23 +0000 (UTC), Daniel Tryba wrote:
> Zoek op mijn naam, post tussen 2002-12-01 en 2003-01-01 in het google
> nieuws archief en je zult een voorbeeld vinden. Niet perfect maar moet
> voldoende zijn om je het goed pad op te helpen.
Heb de betreffende post inmiddels gevonden en ben even aan het
experimenteren. Geeft vooralsnog vooral:
"Bad Request
Your browser sent a request that this server could not understand."
maar dat is al meer dan voorheen.
Misschien komt dat doordat ik de code na
"fwrite($fp,"$post\r\n");" nog niet helemaal begrijp en dus nog niet heb
overgenomen.
Feitelijk wil ik alleen maar een scriptje dat tussen mijn HTML-pagina en
een mailform gaat zitten zodat ik hiermee het email-adres kan verbergen
voor de gebruiker. Wanneer ik eruit ben laat ik het hier wel weten.
Gegroet,
Sander Ros
Daniel Tryba
22/12/03, 21:00
Sander Ros <sanderros@cistron.nl> wrote:
> Heb de betreffende post inmiddels gevonden en ben even aan het
> experimenteren. Geeft vooralsnog vooral:
>
> "Bad Request
> Your browser sent a request that this server could not understand."
>
> maar dat is al meer dan voorheen.
Het is wellicht handig om wat je stuurt hier even te vermelden. Een
packetsniffer is in deze gevallen zeer waardevol.
> Misschien komt dat doordat ik de code na
> "fwrite($fp,"$post\r\n");" nog niet helemaal begrijp en dus nog niet heb
> overgenomen.
De code die dan komt probeert een chunked response te decoden. Kan in
principe worden ingekort tot
while(!feof($fp))
{
echo fread($fp,65535);
}
indien je de response gewoon even raw wilt bekijken.
> Feitelijk wil ik alleen maar een scriptje dat tussen mijn HTML-pagina en
> een mailform gaat zitten zodat ik hiermee het email-adres kan verbergen
> voor de gebruiker. Wanneer ik eruit ben laat ik het hier wel weten.
Dat is precies waar dit script voor gebruikt kan worden, echter gaat het
veel gemakkelijker indien je emailaddress alleen serverside in je code
hebt (wat IMHO de meest normale zaak van de wereld is), MAW je zoekt een
oplossing voor een probleem wat er eigenlijk helemaal niet niet.
--
Daniel Tryba
Sander Ros
22/12/03, 21:00
On Mon, 22 Dec 2003 19:04:22 +0000 (UTC), Daniel Tryba wrote:
>>> Hoe je dat doet staat beschreven in rfc 2616 IIRC.
> Het is echter de enige autoriteit op het gebied van http proctol
> geleuter.
Ik weet het, echter als het gaat om de implementatie ervan in b.v. PHP
zullen velen duizenden mij al zijn voor gegaan. Het wiel voor de 1000+te
manier opnieuw uit te vinden lijkt mij derhalve compleet zinloos.
> Hmmm, kijk eens naar PEAR of zoek naar snoopy, in PEAR zit IIRC ergens
> een httpclient en snoopy is een classes die jij zoekt (IIRC).
;-) Snoopy had ik al hier lokaal staan, na 3 avonden snapte ik er nog de
OOOO-len van. Van classes en OOP heb ik uberhaupt nog nooit iets begrepen
(of de noodzaak gezien mij er in te verdiepen :-( helaas is mijn vakgebied
een compleet andere. s' Avonds zit ik hier maar wat te hobbyen, dat geeft
echter niet altijd genoeg tijd om je er _echt_ in te verdiepen zoals je
graag zou willen.
>>> Zoek op mijn naam, post tussen 2002-12-01 en 2003-01-01 in het google
>>> nieuws archief<KNIP>
>> Ongeveer 106 posts gevonden, ik zal eens kijken.
> Huh! Volgens mij zijn het er maar 4 (het is de yyy-mm-dd notatie).
Google liegt niet, toch? Na selectie bleef er slechts één van de 106 over,
de resultaten daarvan staan vooralsnog in mijn post
<hy41pame9wls.j3wuyoaq41hn$.dlg@40tude.net>
Gegroet,
Sander Ros
Sander Ros
22/12/03, 21:15
Op Maandag 22 Dec 2003 19:49:11 +0000 (UTC), schreef Daniel Tryba:
> Het is wellicht handig om wat je stuurt hier even te vermelden. Een
> packetsniffer is in deze gevallen zeer waardevol.
OK, dan gaan we maar even voor de volledigheid:
Apache 2.x met PHP4.x op Win2000, slechts om te testen, straks moet het op
een 'echte' machine gaan draaien.
Met 'http://127.0.0.1/test/fsock-test.php4?aaa=bbb&ccc=ddd' roep ik nu het
volgende script aan:
<?php
$url="script.php4";
$host="127.0.0.1";
$post='';
foreach($_GET as $key => $value)
{
if($post)
{
$post.='&';
}
$post.=$key.'='.htmlentities($value);
}
if($fp=fsockopen($host,80))
{
fwrite($fp,"POST $url HTTP/1.1\r\n");
fwrite($fp,"Host: $host\r\n");
fwrite($fp,"Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp,"Content-Length: ".strlen($post)."\r\n");
fwrite($fp,"Connection: close\r\n");
fwrite($fp,"\r\n");
while (!feof($fp)) {
// headers uitfilteren!
echo fgets ($fp,128);
}
fclose ($fp);
}
?>
Het script wat vanuit mijn bovenstaande PHP-script wordt aangeroepen wordt
uiteindelijk een mail-a-script.cgi -achtig geval dat een mail verstuurd en
een volgende pagina aan de gebruiker laat zien (zal wel met Header:Location
gebeuren). Voorlopig in deze test-situatie ziet het aangeroepen
'script.php4' er zo uit:
<html>
<body>
<?php
echo "GET: <br>" ;
var_dump($_GET) ;
echo "<br><br>" ;
echo "POST: <br>" ;
var_dump($_POST) ;
echo "<br><br>" ;
?>
</body>
</html>
Zodra ik hier dus onder "POST" de juiste variabelen krijg te zien, ben ik
tevreden, het uitfilteren van de juiste headers is dan slechts een kwestie
van regexen en proberen.
Toch heb ik het gevoel dat hier nog iets fundamenteels fout zit, maar dat
zit dan w.s. na het "fwrite($fp,"$post\r\n");"
Voorlopig al een stuk wijzer,
Sander Ros
Daniel Tryba
22/12/03, 21:30
Sander Ros <sanderros@cistron.nl> wrote:
>> Het is wellicht handig om wat je stuurt hier even te vermelden. Een
>> packetsniffer is in deze gevallen zeer waardevol.
>
> OK, dan gaan we maar even voor de volledigheid:
> Apache 2.x met PHP4.x op Win2000, slechts om te testen, straks moet het op
> een 'echte' machine gaan draaien.
En waarom zou dat geen echte machine zijn?
> Met 'http://127.0.0.1/test/fsock-test.php4?aaa=bbb&ccc=ddd' roep ik nu het
> volgende script aan:
>
> <?php
> $url="script.php4";
url's dienen absoluut te zijn. Het is echt handig om die rfc te lezen :)
[knip]
> Het script wat vanuit mijn bovenstaande PHP-script wordt aangeroepen wordt
> uiteindelijk een mail-a-script.cgi -achtig geval dat een mail verstuurd en
> een volgende pagina aan de gebruiker laat zien (zal wel met Header:Location
> gebeuren).
Als dat script onder je eigen beheer valt is dit dus een totaal
onzinnige oplossing.
--
Daniel Tryba
Daniel Tryba
22/12/03, 21:30
Rene Pijlman <reply.in.the.newsgroup@my.address.is.invalid> wrote:
>>> Waar kan ik die volgen? :)
>>
>>Geen idee, nog niet gevonden. Ik verwacht een verlossend antwoord van
>>Rene (en snel en beetje
>
> http://www.leren.nl/rubriek/computers_en_internet/internetten/zoeken_op_het_web/
Ik mis de 'toon_wat_ik_zoek' knop :)
--
Daniel Tryba
Herbert Groot Jebbink
22/12/03, 23:30
Sander Ros wrote:
> Hoe kan ik dezelfde pagina opvragen volgens de POST-methode, en hoe
> specificeer ik dan de variabelen?
Hieronde wat code uit een monitor module, welke o.a. een post doet in
PHP, er zitten wat funkties in uit een eigen library, doch de
funktionaliteit van die funkties lijkt me wel duidelijk.
/*
Als eerste wordt $get_url via het GET protocol van $host
opgehaalt.
Daarna wordt $post_url via het POST protocol van $host opgehaalt
met als post_variabelen $post_vars waarbij de ontvangen cookies
van $get_url worden meegenomen bij de post van $post_url
Vervolgens moet $check minimaal 1 keer voorkomen op de ontvangen
2e pagina.
*/
$host = 'xxx.xxx.xxx.xxx';
$get_url = '/xxx/Login?rccmd=start
$post_url = '/xxx/Login?rccmd=login&rkey_behavior=default';
$post_vars = array('userName' => 'ikke', 'password' => 'geheim' );
$check = 'rccmd=select&selprocess';
$fp = openHost($host);
if (!$fp)
return 'No connection 1';
fputs($fp, "GET $get_url HTTP/1.0\r\n\r\n");
$respons = getRespons($fp);
if (!$respons)
return 'No data 1';
$cookies = array();
while (parts($respons, 'Set-Cookie: ', ';', $result)) {
$cookie = explode('=', $result[2], 2);
$cookies[$cookie[0]] = trim($cookie[1]);
$respons = $result[3];
}
$fp = openHost($host);
if (!$fp)
return 'No connection 2';
fputs($fp, "POST $post_url HTTP/1.0\r\n");
foreach($cookies as $cookie => $value)
fputs($fp, "Cookie: $cookie=$value\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
$post_data = '';
foreach($post_vars as $var => $value)
$post_data .= urlencode($var) . "=" . urlencode($value) . "&";
$post_data = substr($post_data, 0, -1 );
$post_len = strlen($post_data);
fputs($fp, "Content-length: $post_len\r\n\r\n");
fputs($fp, $post_data);
$respons = getRespons($fp);
if (!$respons)
return 'No data 2';
if (strstr($respons, $check))
return 'Ok';
else
return 'No content';
Sander Ros
23/12/03, 18:30
On Mon, 22 Dec 2003 20:25:08 +0000 (UTC), Daniel Tryba wrote:
>> Apache 2.x met PHP4.x op Win2000, slechts om te testen, straks moet het op
>> een 'echte' machine gaan draaien.
> En waarom zou dat geen echte machine zijn?
Ach, voor 'echte' webservers wordt meestal Linux aangeraden, maar afgezien
daarvan bedoelde ik echter meer dat dit de config bij mij thuis is, en dat
het later op een webserver elders komt te staan.
>> $url="script.php4";
> url's dienen absoluut te zijn. Het is echt handig om die rfc te lezen :)
Hmm, en ik hoopte vanavond nog wel in de nieuwste 'Harry' te kunnen
beginnen, dan maar die RFC.
> Als dat script onder je eigen beheer valt is dit dus een totaal
> onzinnige oplossing.
Dat script valt dus net niet onder mijn eigen beheer, ook al staat het op
dezelfde server, vandaar.
Ik ga maar eens een RFC-tje lezen. Tot later!
Gegroet,
Sander Ros
Sander Ros
23/12/03, 19:45
On Mon, 22 Dec 2003 20:25:08 +0000 (UTC), Daniel Tryba wrote:
> url's dienen absoluut te zijn. <knip die +/- 8313-regelige RFC>
STOM! van me.
Dat script staat notabene in een subdir van de root, dus hoe zal dat eerste
script het andere anders ooit vinden...
E.e.a werkt na aanpassing hiervan redelijk, afgezien van het feit dat er
her en der opeens lettercombi's als b2, f4 en 0 opdoken.
Heb hierop de rest van jouw code ook maar in het script gegooid en :-)
perfect! Bij deze dus w.s. mijn eerste kennismaking met chunks. Misschien
dat ik er vanavond nog wat van opsteek als ik die RFC ga doorlezen, want ik
begrijp er nog geen sikkepit van.
Eigen variabelen toevoegen is inmiddels uiteraard een eitje, en het
vervolgens uitfilteren van eventuele headers die doorgestuurd mogen worden
lukt ook wel met het voorbeeld dat in jouw script staat.
Bedankt.
Als ik nu ook nog ga _begrijpen_ hoe dat precies met die chunks zit, ga ik
als een gelukkig man het nieuwe jaar in.
Gegroet,
Sander Ros