Jak publikować dane w PHP za pomocą file get contents?

Używam funkcji PHP file_get_contents() do pobierania zawartości adresu URL, a następnie przetwarzam nagłówki przez zmienną $http_response_header.

Teraz problem polega na tym, że niektóre adresy URL wymagają pewnych danych, które mają zostać wysłane do adresu URL(na przykład strony logowania).

Jak to zrobić?

Zdaję sobie sprawę, że używając stream_context mogę to zrobić, ale nie jestem do końca jasny.

Dzięki.
Author: dnlcrl, 2010-03-15

3 answers

Wysyłanie żądania HTTP POST za pomocą file_get_contents nie jest to wcale takie trudne : jak się domyślasz, musisz użyć parametru $context.


Jest przykład podany w podręczniku PHP, na tej stronie: opcje kontekstu HTTP (cytowanie) :

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

Zasadniczo musisz utworzyć strumień, z odpowiednimi opcjami (na tej stronie znajduje się pełna lista) i użyć go jako Trzeciego parametru file_get_contents -- nic więcej; -)


Jako sidenote : ogólnie rzecz biorąc, aby wysyłać żądania HTTP POST, zwykle używamy curl, który zapewnia wiele opcji i wszystko -- ale strumienie są jedną z ładnych rzeczy PHP, o których nikt nie wie... szkoda...

 521
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-15 05:44:26

Alternatywą, możesz również użyć 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");
}
 17
Author: Macbric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-09 19:29:08
$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");
}
 0
Author: user2525449,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 10:20:24