PHP में file_get_contents का उपयोग करके डेटा कैसे पोस्ट करें?


299

मैं file_get_contents()URL की सामग्री लाने के लिए PHP के फ़ंक्शन का उपयोग कर रहा हूं और फिर मैं चर के माध्यम से हेडर प्रोसेस करता हूं $http_response_header

अब समस्या यह है कि URL में से कुछ URL के लिए कुछ डेटा की आवश्यकता होती है (उदाहरण के लिए, लॉगिन पृष्ठ)।

मैं उसको कैसे करू?

मुझे पता है कि मैं ऐसा करने में सक्षम हो सकता हूं लेकिन मैं पूरी तरह से स्पष्ट नहीं हूं।

धन्यवाद।



8
इसे असीम रूप से उखाड़ा जाना चाहिए। यदि आपके पास कच्ची PHP कार्यक्षमता है जो काम करते हैं तो कर्ल / गज़ल या किसी अन्य फैंसी लाइब्रेरी का उपयोग करने का कोई कारण नहीं है।
उमर आबिद

जवाबों:


589

HTTP POST अनुरोध का उपयोग file_get_contentsकरना कठिन नहीं है, वास्तव में: जैसा कि आपने अनुमान लगाया था, आपको $contextपैरामीटर का उपयोग करना होगा ।


इस पृष्ठ पर PHP मैनुअल में एक उदाहरण दिया गया है: HTTP संदर्भ विकल्प (उद्धृत) :

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

मूल रूप से, आपको सही विकल्पों के साथ एक धारा बनानी होगी (उस पृष्ठ पर पूरी सूची है) , और तीसरे पैरामीटर के रूप में इसका उपयोग करें file_get_contents- और कुछ नहीं; ;-)


एक विचार के रूप में: आम तौर पर, HTTP POST अनुरोध भेजने के लिए, हम कर्ल का उपयोग करते हैं, जो बहुत सारे विकल्प प्रदान करता है - लेकिन धाराएँ PHP की उन अच्छी चीजों में से एक हैं जिनके बारे में कोई नहीं जानता ... बहुत बुरा .. ।


1
धन्यवाद। मुझे लगता है कि अगर मैं अनुरोधित पृष्ठ पर समान POST पैरामेट्स को पारित करने की आवश्यकता है, तो मैं $ _POST से सामग्री को $ postdata में सम्मिलित कर सकता हूं?
पारस चोपड़ा

6
मुझे लगता है आप ऐसा कुछ कर सकते हैं; लेकिन contentएक PHP सरणी नहीं होना चाहिए: यह एक क्वेरी स्ट्रिंग हो गया है (यानी चाहिए यह इस प्रारूप है: param1=value1&param2=value2&param3=value3) ;; जिसका अर्थ है कि आप शायद का उपयोग करना होगाhttp_build_query($_POST)
पास्कल मार्टिन

2
आश्चर्यजनक! मैं दूसरे पृष्ठ पर POST डेटा को पारित करने के लिए एक रास्ता खोज रहा था जो करने से प्राप्त हो जाता है $postdata = http_build_query($_POST)
लियाम न्यूमरच

1
पर्याप्त रूप से यह मेरे लिए काम नहीं करता है, मैं इसे कुछ घंटों के लिए आज़मा रहा हूं और मेरे सभी आवश्यक प्रश्न क्वेरी में बदल जाते हैं
WojonsTech

1
कई हेडर मान भेजने के लिए, उन सभी को \r\nलाइन ब्रेक के साथ एक स्ट्रिंग में फेंक दें - देखें: stackoverflow.com/a/2107792/404960
rymo

20

एक विकल्प, आप फोपेन का उपयोग भी कर सकते हैं

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

किसी कारण से, यह मेरे लिए काम करता है, लेकिन PHP आधिकारिक उदाहरण नहीं था। toto=1&tata=2साथ ही के लिए +1 । मैं fopenहालांकि का उपयोग नहीं किया ।
माइकल यावोरस्की

4
@ Noiobàɗ हम यहां लोगों को 'noob' नहीं कहते हैं। यह इस तरह के खिलाफ एक दोस्ताना चेतावनी है।
डेडालस

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");
}

2
कृपया, कोड को कॉपी / पेस्ट करने के बजाय एक विस्तृत जवाब देने का प्रयास करें।
फेलिप लेओओ

1
इसके अलावा यह अनावश्यक रूप से जटिल है। आप + के file_get_contentsबजाय उपयोग कर सकते हैं । और आप "फाइल" को भी बंद नहीं कर रहे हैं। @PascalMARTIN द्वारा स्वीकृत उत्तर देखें। fopenstream_get_contents
मार्टिन प्रिक्रील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.