Bagaimana cara mengirim data dalam PHP menggunakan file_get_contents?

299

Saya menggunakan fungsi PHP file_get_contents()untuk mengambil konten URL dan kemudian saya memproses tajuk melalui variabel $http_response_header.

Sekarang masalahnya adalah bahwa beberapa URL memerlukan beberapa data untuk diposting ke URL (misalnya, halaman login).

Bagaimana aku melakukan itu?

Saya sadar menggunakan stream_context saya mungkin bisa melakukan itu tetapi saya tidak sepenuhnya jelas.

Terima kasih.

Paras Chopra
sumber
8
Ini harus ditingkatkan secara tak terbatas. Tidak ada alasan untuk menggunakan Curl / Guzzle atau perpustakaan mewah lainnya jika Anda memiliki fungsi PHP mentah yang melakukan pekerjaan itu.
Omar Abid

Jawaban:

589

Mengirim permintaan HTTP POST menggunakan file_get_contentstidak sulit, sebenarnya: seperti yang Anda duga, Anda harus menggunakan $contextparameter.


Ada contoh yang diberikan dalam manual PHP, di halaman ini: Opsi konteks HTTP (mengutip) :

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

Pada dasarnya, Anda harus membuat aliran, dengan opsi yang tepat (ada daftar lengkap di halaman itu) , dan menggunakannya sebagai parameter ketiga untuk file_get_contents- tidak lebih ;-)


Sebagai sidenote: secara umum, untuk mengirim permintaan HTTP POST, kita cenderung menggunakan curl, yang menyediakan banyak pilihan, tetapi stream adalah salah satu hal yang menyenangkan dari PHP yang tidak diketahui oleh siapa pun ... terlalu buruk .. .

Pascal MARTIN
sumber
1
Terima kasih. Saya kira saya dapat memasukkan konten dari $ _POST ke dalam $ postdata jika saya harus meneruskan params POST yang sama ke halaman yang diminta?
Paras Chopra
6
Saya kira Anda dapat melakukan sesuatu seperti itu; tetapi contenttidak harus array PHP: itu harus QueryString (yaitu harus memiliki format ini: param1=value1&param2=value2&param3=value3) ;; yang berarti Anda mungkin harus menggunakanhttp_build_query($_POST)
Pascal MARTIN
2
Hebat! Saya mencari cara untuk mengirimkan data POST ke halaman lain yang dapat dicapai dengan melakukan $postdata = http_build_query($_POST).
Liam Newmarch
1
cukup menarik ini tidak bekerja untuk saya sama sekali saya telah mencobanya selama beberapa jam dan semua requets saya bisa berubah menjadi get querys
WojonsTech
1
Untuk mengirim beberapa nilai tajuk, buang semuanya menjadi satu string dengan \r\njeda baris - lihat: stackoverflow.com/a/2107792/404960
rymo
20

Sebagai alternatif, Anda juga bisa menggunakan 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");
}
Macbric
sumber
Untuk beberapa alasan, ini berhasil bagi saya, tetapi contoh resmi PHP tidak. +1 untuk toto=1&tata=2juga. Saya tidak menggunakan fopen, namun.
Michael Yaworski
4
@ Ġiĺàɗ Kami tidak menyebut orang 'noob' di sini. Ini peringatan ramah terhadap hal itu.
Daedalus
0
$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");
}
pengguna2525449
sumber
2
Tolong, cobalah untuk memberikan jawaban yang diuraikan alih-alih hanya menyalin / menempelkan kode.
Felipe Leão
1
Ini juga tidak perlu rumit. Anda bisa menggunakan file_get_contentsbukan fopen+ stream_get_contents. Dan Anda bahkan tidak menutup "file". Lihat jawaban yang diterima oleh @PascalMARTIN.
Martin Prikryl