2010-03-15 36 views
234

Estoy usando la función de PHP file_get_contents() para recuperar el contenido de una URL y luego procesar encabezados a través de la variable $http_response_header.Cómo publicar datos en PHP usando file_get_contents?

Ahora el problema es que algunas de las URL necesitan que se publiquen algunos datos en la URL (por ejemplo, páginas de inicio de sesión).

¿Cómo puedo hacer eso?

Me doy cuenta de que al usar stream_context puedo hacerlo, pero no estoy del todo claro.

Gracias.

+0

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

+3

Esto se debe upvoted infinitamente. No hay ninguna razón para usar Curl/Guzzle o cualquier otra biblioteca elegante si tiene la funcionalidad PHP sin procesar que hace el trabajo. –

Respuesta

487

Enviar una solicitud HTTP POST usando file_get_contents no es tan difícil, en realidad: como suponía, debe usar el parámetro $context.


Hay un ejemplo que figura en el manual de PHP, en esta página: HTTP context options(citando):

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

Básicamente, usted tiene que crear una corriente, con las opciones correctas (hay una lista completa de esa página), y utilizarlo como tercer parámetro a file_get_contents - nada más ;-)


como comentario: En términos generales, para enviar solicitudes HTTP POST, tendemos a utilizar curl, que ofrece muchas opciones, todas, pero las transmisiones son una de las cosas buenas de PHP que nadie conoce ... muy mal ...

+1

Gracias. ¿Supongo que puedo insertar el contenido de $ _POST en $ postdata si necesito pasar los mismos parámetros de POST a la página solicitada? –

+5

Supongo que puedes hacer algo como eso; pero 'content' no debe ser una matriz de PHP: tiene que ser una cadena de consulta * (es decir, debe tener este formato:' param1 = value1 & param2 = value2 & param3 = value3') * ;; lo que significa que probablemente tendrá que usar 'http_build_query ($ _ POST)' –

+1

¡Maravilloso! Estaba buscando una forma de pasar los datos POST a otra página que se puede lograr haciendo '$ postdata = http_build_query ($ _ POST)'. –

14

Una alternativa, también se puede utilizar 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

Por alguna razón, esto funcionó para mí, pero el ejemplo oficial de PHP no. +1 para 'toto = 1 & tata = 2' también. No usé el 'fopen', sin embargo. –

+1

@ Ġiĺàɗ No llamamos a la gente 'novato' aquí. Esta es una amistosa advertencia contra tales. – 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"); 
}