Pergunta

Eu estou usando o PHP tem a função de file_get_contents() para buscar o conteúdo de uma URL e, em seguida, eu cabeçalhos de processo através da variável $http_response_header.

Agora, o problema é que algumas das URLs precisa de alguns dados a ser lançado para o URL (por exemplo, páginas de início de sessão).

Como faço isso?

Eu percebo usando stream_context que eu seja capaz de fazer isso, mas eu não estou totalmente claro.

Obrigado.

Foi útil?

Solução

O envio de uma solicitação HTTP POST usando file_get_contents não é tão difícil, na verdade :como você adivinhou, você tem que usar o $context o parâmetro.


Há um exemplo dado no manual do PHP, esta página : HTTP opções de contexto (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);

Basicamente, você tem de criar uma sequência, com direito a opções (não é uma lista completa na página), e usá-lo como o terceiro parâmetro para file_get_contents - nada mais ;-)


Como uma nota :em geral, para enviar solicitações HTTP POST, nós tendemos a usar o curl, que oferece um monte de opções de um tudo, mas, fluxos são uma das coisas mais interessantes do PHP que ninguém sabe sobre...muito ruim...

Outras dicas

Uma alternativa, você também pode usar 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");
}
$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");
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top