2010-03-15 49 views
234

Tôi đang sử dụng chức năng của PHP file_get_contents() để tìm nạp nội dung của URL và sau đó tôi xử lý tiêu đề thông qua biến $http_response_header.Làm thế nào để đăng dữ liệu trong PHP bằng cách sử dụng file_get_contents?

Bây giờ vấn đề là một số URL cần một số dữ liệu được đăng lên URL (ví dụ: trang đăng nhập).

Tôi làm như thế nào?

Tôi nhận thấy việc sử dụng stream_context Tôi có thể làm điều đó nhưng tôi không hoàn toàn rõ ràng.

Cảm ơn.

+0

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

+3

này nên được bỏ phiếu tán vô hạn. Không có lý do gì để sử dụng Curl/Guzzle hoặc bất kỳ thư viện ưa thích nào khác nếu bạn có chức năng PHP thô thực hiện công việc. –

Trả lời

487

Gửi yêu cầu HTTP POST bằng cách sử dụng file_get_contents thực sự không khó như bạn đoán, bạn phải sử dụng thông số $context.


Có một ví dụ được đưa ra trong cuốn hướng dẫn PHP, tại trang này: HTTP context options(trích dẫn):

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

Về cơ bản, bạn phải tạo một dòng suối, với các tùy chọn đúng (có một danh sách đầy đủ trên trang đó), và sử dụng nó như là tham số thứ ba để file_get_contents - không có gì hơn ;-)


là một sidenote: nói chung, để gửi yêu cầu HTTP POST, chúng tôi có xu hướng sử dụng curl, cung cấp nhiều tùy chọn cho tất cả - nhưng luồng là một trong những điều tốt đẹp của PHP mà không ai biết về ... quá xấu ...

+1

Cảm ơn. Tôi đoán tôi có thể chèn nội dung từ $ _POST vào $ postdata nếu tôi cần chuyển cùng một thông số POST cho trang được yêu cầu? –

+5

Tôi cho rằng bạn có thể làm điều gì đó như thế; nhưng 'nội dung' không được là mảng PHP: nó phải là chuỗi truy vấn * (nghĩa là nó phải có định dạng này:' param1 = value1 & param2 = value2 & param3 = value3') * ;; có nghĩa là bạn có thể sẽ phải sử dụng 'http_build_query ($ _ POST)' –

+1

Tuyệt vời! Tôi đang tìm cách chuyển dữ liệu POST tới một trang khác có thể đạt được bằng cách thực hiện '$ postdata = http_build_query ($ _ POST)'. –

14

Một thay thế, bạn cũng có thể sử dụng 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

Vì lý do nào đó, điều này làm việc cho tôi, nhưng ví dụ chính thức của PHP thì không. +1 cho 'toto = 1 & tata = 2'. Tuy nhiên, tôi không sử dụng 'fopen'. –

+1

@ Ġiĺàɗ Chúng tôi không gọi mọi người là 'noob' ở đây. Đây là một cảnh báo thân thiện chống lại như vậy. – 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"); 
} 
Các vấn đề liên quan