2010-03-15 7 views
234

J'utilise la fonction file_get_contents() de PHP pour récupérer le contenu d'une URL et ensuite traiter les en-têtes via la variable $http_response_header.Comment publier des données en PHP en utilisant file_get_contents?

Maintenant, le problème est que certaines des URL ont besoin de certaines données à publier sur l'URL (par exemple, les pages de connexion).

Comment faire cela?

Je réalise en utilisant stream_context je peux être en mesure de le faire mais je ne suis pas tout à fait clair.

Merci.

+0

http://php.net/manual/en/function.stream-context-create.php#89080 – Ben

+3

Cela devrait être upvoted infiniment. Il n'y a aucune raison d'utiliser Curl/Guzzle ou toute autre bibliothèque sophistiquée si vous avez des fonctionnalités PHP brutes qui font le travail. –

Répondre

487

L'envoi d'une requête HTTP POST en utilisant file_get_contents n'est pas si difficile, en fait: comme vous l'avez deviné, vous devez utiliser le paramètre $context.


Il y a un exemple donné dans le manuel PHP, à cette page: HTTP context options(citant):

$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); 

Fondamentalement, vous devez créer un flux, avec les bonnes options (il y a une liste complète sur cette page), et l'utiliser comme troisième paramètre à file_get_contents - rien de plus ;-)


en sidenote: D'une manière générale, pour envoyer des requêtes HTTP POST, nous avons tendance à utiliser curl, qui fournit beaucoup d'options mais les flux sont l'une des choses sympas de PHP que personne ne connaît ... dommage ...

+1

Merci. Je suppose que je peux insérer le contenu de $ _POST dans $ postdata si j'ai besoin de passer les mêmes paramètres POST à ​​la page demandée? –

+5

Je suppose que vous pouvez faire quelque chose comme ça; mais 'content' ne doit pas être un tableau PHP: il doit être un querystring * (c'est-à-dire qu'il doit avoir ce format:' param1 = valeur1 & param2 = valeur2 & param3 = valeur3') * ;; ce qui signifie que vous devrez probablement utiliser 'http_build_query ($ _ POST)' –

+1

Wonderful! Je cherchais un moyen de transmettre les données POST à ​​une autre page qui est réalisable en faisant '$ postdata = http_build_query ($ _ POST)'. –

14

Une alternative, vous pouvez également utiliser fopen

$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"); 
} 
+0

Pour une raison quelconque, cela a fonctionné pour moi, mais pas l'exemple officiel de PHP. +1 pour le 'toto = 1 & tata = 2' aussi. Cependant, je n'ai pas utilisé le 'fopen'. –

+1

@ Ġiĺàɗ Nous n'appelons pas les gens 'noob' ici. Ceci est un avertissement amical contre tel. – Daedalus

1
$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"); 
} 
Questions connexes