Wie poste ich Daten in PHP mit file_get_contents?


299

Ich verwende die PHP-Funktion file_get_contents(), um den Inhalt einer URL abzurufen, und verarbeite dann Header über die Variable $http_response_header.

Das Problem besteht nun darin, dass einige der URLs Daten benötigen, um an die URL gesendet zu werden (z. B. Anmeldeseiten).

Wie mache ich das?

Mir ist klar, dass ich mit stream_context das vielleicht kann, aber mir ist nicht ganz klar.

Vielen Dank.



8
Dies sollte unendlich positiv bewertet werden. Es gibt keinen Grund, Curl / Guzzle oder eine andere schicke Bibliothek zu verwenden, wenn Sie über rohe PHP-Funktionen verfügen, die diese Aufgabe erfüllen.
Omar Abid

Antworten:


589

Das Senden einer HTTP-POST-Anfrage mit file_get_contentsist eigentlich gar nicht so schwer: Wie Sie vermutet haben, müssen Sie den $contextParameter verwenden.


Im PHP-Handbuch finden Sie auf dieser Seite ein Beispiel: HTTP-Kontextoptionen (Anführungszeichen) :

$postdata = http_build_query(
    array(
        'var1' => 'some content',
        'var2' => 'doh'
    )
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://example.com/submit.php', false, $context);

Grundsätzlich müssen Sie einen Stream mit den richtigen Optionen erstellen (es gibt eine vollständige Liste auf dieser Seite) und ihn als dritten Parameter verwenden, um file_get_contents- nichts weiter ;-)


Als Nebenbemerkung: Um HTTP-POST-Anfragen zu senden, verwenden wir im Allgemeinen Curl, das viele Optionen bietet - aber Streams sind eines der schönen Dinge von PHP, von denen niemand etwas weiß ... schade. .


1
Vielen Dank. Ich vermute, ich kann den Inhalt von $ _POST in $ postdata einfügen, wenn ich dieselben POST-Parameter an die angeforderte Seite übergeben muss.
Paras Chopra

6
Ich nehme an, Sie können so etwas tun. aber contentmuss nicht ein PHP - Array sein: es hat eine Abfragezeichenfolgeflag sein (dh es muss hat dieses Format: param1=value1&param2=value2&param3=value3) ;; was bedeutet, dass Sie wahrscheinlich verwenden müssenhttp_build_query($_POST)
Pascal MARTIN

2
Wunderbar! Ich suchte nach einer Möglichkeit, POST-Daten an eine andere Seite zu übergeben, was dadurch möglich ist $postdata = http_build_query($_POST).
Liam Newmarch

1
Interessanterweise funktioniert das überhaupt nicht für mich. Ich habe es ein paar Stunden lang versucht und alle meine Anforderungen werden in Abfragen umgewandelt
WojonsTech

1
Um mehrere Header-Werte zu senden, werfen Sie sie alle in einen String mit \r\nZeilenumbrüchen - siehe: stackoverflow.com/a/2107792/404960
rymo

20

Alternativ können Sie auch fopen verwenden

$params = array('http' => array(
    'method' => 'POST',
    'content' => 'toto=1&tata=2'
));

$ctx = stream_context_create($params);
$fp = @fopen($sUrl, 'rb', false, $ctx);
if (!$fp)
{
    throw new Exception("Problem with $sUrl, $php_errormsg");
}

$response = @stream_get_contents($fp);
if ($response === false) 
{
    throw new Exception("Problem reading data from $sUrl, $php_errormsg");
}

Aus irgendeinem Grund funktionierte dies für mich, das offizielle PHP-Beispiel jedoch nicht. +1 auch für die toto=1&tata=2. Ich habe das jedoch nicht benutzt fopen.
Michael Yaworski

4
@ Ġiĺàɗ Wir nennen die Leute hier nicht "noob". Dies ist eine freundliche Warnung vor solchen.
Daedalus

0
$sUrl = 'http://www.linktopage.com/login/';
$params = array('http' => array(
    'method'  => 'POST',
    'content' => 'username=admin195&password=d123456789'
));

$ctx = stream_context_create($params);
$fp = @fopen($sUrl, 'rb', false, $ctx);
if(!$fp) {
    throw new Exception("Problem with $sUrl, $php_errormsg");
}

$response = @stream_get_contents($fp);
if($response === false) {
    throw new Exception("Problem reading data from $sUrl, $php_errormsg");
}

2
Bitte versuchen Sie, eine ausführliche Antwort zu geben, anstatt einfach Code zu kopieren / einzufügen.
Felipe Leão

1
Auch das ist unnötig kompliziert. Sie können file_get_contentsanstelle von fopen+ verwenden stream_get_contents. Und Sie schließen nicht einmal die "Datei". Siehe die akzeptierte Antwort von @PascalMARTIN.
Martin Prikryl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.