2010-03-15 12 views
234

Używam funkcji PHP file_get_contents() do pobierania zawartości adresu URL, a następnie przetwarzam nagłówki za pomocą zmiennej $http_response_header.Jak publikować dane w PHP za pomocą file_get_contents?

Problem polega na tym, że niektóre adresy URL wymagają umieszczenia niektórych danych w adresie URL (na przykład stron logowania).

Jak to zrobić?

Zdaję sobie sprawę, używając stream_context może być w stanie to zrobić, ale nie jestem całkowicie jasne.

Dzięki.

+0

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

+3

ten powinien być upvoted nieskończoność. Nie ma powodu, aby używać Curl/Guzzle lub jakiejkolwiek innej wyszukanej biblioteki, jeśli masz surową funkcjonalność PHP, która wykonuje tę pracę. –

Odpowiedz

487

Wysłanie żądania HTTP POST przy użyciu file_get_contents nie jest takie trudne, ponieważ: jak można się domyślić, należy użyć parametru $context.


Jest to przykład podano w podręczniku PHP, na tej stronie: HTTP context options(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 trzeba utworzyć strumień, z odpowiednimi opcjami (istnieje pełna lista na tej stronie) i używać go jako trzeci parametr file_get_contents - nic więcej ;-)


jak sidenote: mówiąc ogólnie, aby wysyłać żądania HTTP POST, mamy tendencję do używania curl, który zapewnia wiele opcji, ale strumienie są jedną z miłych rzeczy w PHP, o których nikt nie wie ... szkoda ...

+1

Dzięki. Zgaduję, że mogę wstawić zawartość z $ _POST do $ postdata, jeśli muszę przekazać te same parametry POST do żądanej strony? –

+5

Przypuszczam, że możesz zrobić coś takiego; ale 'content' nie może być tablicą PHP: musi to być typowy * (tzn. musi mieć ten format:' param1 = wartość1 i parametr2 = wartość2 i parametr3 = wartość3') * ;; co oznacza, że ​​prawdopodobnie będziesz musiał użyć 'http_build_query ($ _ POST)' –

+1

Cudownie! Szukałem sposobu na przekazanie danych POST do innej strony, która jest możliwa do osiągnięcia, wykonując '$ postdata = http_build_query ($ _ POST)'. –

14

Alternatywnie można 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"); 
} 
+0

Z jakiegoś powodu zadziałało to dla mnie, ale oficjalny przykład PHP tego nie zrobił. +1 także dla 'toto = 1 & tata = 2'. Nie skorzystałem jednak z 'fopen'. –

+1

@ ĺiĺàɗ Nie nazywamy tutaj ludzi noobem. Jest to przyjazne ostrzeżenie przed takimi. – 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"); 
} 
Powiązane problemy