मैं PHP के साथ POST अनुरोध कैसे भेजूँ?


656

वास्तव में मैं खोज क्वेरी के बाद आने वाली सामग्री को पढ़ना चाहता हूं, जब यह किया जाता है। समस्या यह है कि URL केवल POSTविधियों को स्वीकार करता है, और यह GETविधि के साथ कोई कार्रवाई नहीं करता है ...

मुझे domdocumentया की सहायता से सभी सामग्री को पढ़ना है file_get_contents()। क्या कोई विधि है जो मुझे POSTविधि के साथ पैरामीटर भेजने और फिर सामग्री को पढ़ने देगी PHP?

जवाबों:


1260

PHP5 के साथ CURL- कम विधि:

$url = 'http://server.com/path';
$data = array('key1' => 'value1', 'key2' => 'value2');

// use key 'http' even if you send the request to https://...
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => http_build_query($data)
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }

var_dump($result);

विधि के बारे में अधिक जानकारी और हेडर जोड़ने के लिए PHP मैनुअल देखें, उदाहरण के लिए:


64
यह ध्यान देने योग्य है कि यदि आप हेडर के लिए एक सरणी का उपयोग करने का निर्णय लेते हैं, तो '\ r \ n' के साथ कुंजियों या मानों को समाप्त न करें। stream_context_create () केवल पाठ को पहले '\ r \ n' तक ले जाएगा
रैप्टर

11
किसी URL को फ़ाइल नाम के रूप में file_get_contents()केवल तभी उपयोग किया जा सकता है जब फ़ॉपन रैपर सक्षम किया गया हो। देखें php.net/manual/en/...
पिनो

3
@ आई लवfile_get_contents()
डेडलॉक

14
क्या CURL का उपयोग नहीं करने का कोई विशेष कारण है?
jvannistelrooy

37
PHP के लिए @jvannistelrooy CURL एक ऐसा विस्तार है जो सभी वातावरणों में मौजूद नहीं हो सकता है जबकि file_get_contents()PHP के मूल का हिस्सा है। इसके अलावा, अनावश्यक रूप से एक्सटेंशन का उपयोग करने से आपके ऐप की हमले की सतह चौड़ी हो सकती है। उदा। Google php कर्ल cve
पॉकेटैंड

139

आप cURL का उपयोग कर सकते हैं :

<?php
//The url you wish to send the POST request to
$url = $file_name;

//The data you want to send via POST
$fields = [
    '__VIEWSTATE '      => $state,
    '__EVENTVALIDATION' => $valid,
    'btnSubmit'         => 'Submit'
];

//url-ify the data for the POST
$fields_string = http_build_query($fields);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//So that curl_exec returns the contents of the cURL; rather than echoing it
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 

//execute post
$result = curl_exec($ch);
echo $result;
?>

3
यह मेरे लिए काम करता है क्योंकि मैं जिस पेज पर एक पेज भेज रहा हूं, उसमें ऐसी कोई सामग्री नहीं है जिससे file_get_contents संस्करण काम नहीं करता।
कमेंटलव

9
file_get_contents समाधान PHP के विन्यास पर allow_url_fopen बंद (साझा होस्टिंग में जैसे) के साथ काम नहीं करता है। यह संस्करण कर्ल लाइब्रेरी का उपयोग करता है और मुझे लगता है कि यह सबसे "सार्वभौमिक" है, इसलिए मैं आपको अपना वोट देता हूं
डेट्रोन गैलार्डो

81
: आप साइट है जहाँ आप इस कोड का नमूना कॉपी नहीं किया davidwalsh.name/curl-post
efreed

4
हालांकि यह बहुत महत्वपूर्ण नहीं है, CURLOPT_POSTFIELDS पैरामीटर डेटा वास्तव में एक स्ट्रिंग ("urlified") में बदलने की आवश्यकता नहीं है। उद्धरण: "इस पैरामीटर को 'para1 = val1 & para2 = val2 & ...' जैसे urlencoded string के रूप में पास किया जा सकता है या मान के रूप में कुंजी और फ़ील्ड डेटा के रूप में फ़ील्ड नाम के साथ एक सरणी के रूप में। यदि मान एक सरणी है, तो सामग्री-प्रकार हेडर को मल्टीपार्ट / फॉर्म-डेटा के लिए सेट किया जाएगा। " लिंक: php.net/manual/en/function.curl-setopt.php
एडवर्ड

2
इसके अलावा, इसे अलग तरीके से लिखने के लिए कोई अपराध नहीं है, लेकिन मुझे नहीं पता कि CURLOPT_POST पैरामीटर को यहां एक संख्या के रूप में क्यों निर्दिष्ट किया गया है क्योंकि यह मैनुअल पेज पर एक बूलियन पर सेट करने के लिए कहता है। उद्धरण: "CURLOPT_POST: नियमित HTTP POST करने के लिए सही है।" लिंक: php.net/manual/en/function.curl-setopt.php
एडवर्ड

68

मैं कर्ल का उपयोग करके डेटा पोस्ट करने के लिए निम्न फ़ंक्शन का उपयोग करता हूं। $ डेटा पोस्ट करने के लिए फ़ील्ड का एक सरणी है (http_build_query का उपयोग करके सही ढंग से एन्कोड किया जाएगा)। एप्लिकेशन / x-www-form-urlencoded का उपयोग करके डेटा एन्कोड किया गया है।

function httpPost($url, $data)
{
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}

@Edward का उल्लेख है कि http_build_query को छोड़ा जा सकता है क्योंकि कर्ल CURLOPT_POSTFIELDS पैरामीटर में पास किए गए सरणी को सही ढंग से एन्कोड करेगा, लेकिन आपको सलाह दी जाएगी कि इस मामले में मल्टीपार्ट या फॉर्म-डेटा का उपयोग करके डेटा एन्कोड किया जाएगा।

मैं इस फ़ंक्शन का उपयोग API के साथ करता हूं, जो एप्लिकेशन / x-www-form-urlencoded का उपयोग करके डेटा को इनकोड करने की अपेक्षा करता है। इसलिए मैं http_build_query () का उपयोग करता हूं।


CURLOPT_POSTFIELDS को पासिंग सरणी डेटा को मल्टीपार्ट / फॉर्म-डेटा का उपयोग करके एन्कोडेड करने का कारण बनता है जो वांछनीय नहीं हो सकता है।
दीमा एल।

उपयोगकर्ता ने file_get_contents के लिए पूछा, इसलिए उसे
डिफ़ॉल्ट_स्ट्रीम_कंटेक्स्ट

स्पष्ट करने के लिए: मुझे लगता है @DimaL। हटाए गए एक टिप्पणी का जवाब दे रहा है; मल्टीपार्ट / फॉर्म-डेटा के रूप में आउटपुट से बचने के लिए सरणी को एक स्ट्रिंग में http_build_queryकनवर्ट करता है $data
टूलमेकरसेव

@ Radon8472 - सामग्री युक्त ... CURLOPT_RETURNTRANSFER, trueमें परिणाम $response
टूलमेकरसेव

@ToolmakerSteve जैसा कि मैंने कहा, सवाल था file_get_contentsऔर आपके समाधान के लिए CURL की जरूरत है जो न तो बहुत से लोगों के पास है। तो आपका समाधान शायद काम कर रहा है, लेकिन यह इस सवाल का जवाब नहीं दे रहा है कि देशी बिलियन फ़ाइल / स्ट्रीम फ़ंक्शन के साथ यह कैसे करें।
Radon8472

42

मैं आपको ओपन-सोर्स पैकेज गज़ल का उपयोग करने की सलाह देता हूं जो पूरी तरह से परीक्षण की गई इकाई है और नवीनतम कोडिंग प्रथाओं का उपयोग करता है।

गुझिया स्थापित करना

अपने प्रोजेक्ट फ़ोल्डर में कमांड लाइन पर जाएं और निम्न कमांड टाइप करें (यह मानते हुए कि आपके पास पहले से ही पैकेज मैनेजर कंपोजर स्थापित है)। यदि आपको संगीतकार को स्थापित करने में सहायता की आवश्यकता है, तो आपको यहां एक नज़र रखना चाहिए

php composer.phar require guzzlehttp/guzzle

एक POST अनुरोध भेजने के लिए Guzzle का उपयोग करना

एक हल्के वजन वाले ऑब्जेक्ट-ओरिएंटेड API का उपयोग करते हुए, गुज़ल का उपयोग बहुत आगे है:

// Initialize Guzzle client
$client = new GuzzleHttp\Client();

// Create a POST request
$response = $client->request(
    'POST',
    'http://example.org/',
    [
        'form_params' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ]
    ]
);

// Parse the response object, e.g. read the headers, body, etc.
$headers = $response->getHeaders();
$body = $response->getBody();

// Output headers and body for debugging purposes
var_dump($headers, $body);

7
यह जानना उपयोगी होगा कि इससे पहले से ही पोस्ट किए गए देशी PHP समाधान में क्या फायदे हैं, और एक भी है।
Artfulrobot

9
@artfulrobot: देशी PHP-solution में बहुत सारी समस्याएं हैं (जैसे कि https, प्रमाणपत्र सत्यापन, आदि। से जुड़ना), यही वजह है कि लगभग हर PHP डेवलपर cURL का उपयोग करता है। और इस मामले में CURL का उपयोग क्यों नहीं किया गया? यह सरल है: गज़ल में एक सीधा-आगे, आसान, हल्का-वजन वाला इंटरफ़ेस है जो उन सभी "निम्न-स्तरीय cURL हैंडलिंग समस्याओं" को दूर करता है। आधुनिक PHP विकसित करने वाले लगभग सभी लोग वैसे भी संगीतकार का उपयोग करते हैं, इसलिए गुज़ल का उपयोग करना वास्तव में सरल है।
एंड्रियास

2
धन्यवाद, मुझे पता है कि guzzle लोकप्रिय है, हालांकि ऐसे मामले हैं जब संगीतकार दु: ख का कारण बनता है (जैसे बड़ी सॉफ़्टवेयर परियोजनाओं के लिए प्लगइन्स विकसित करना जो पहले से ही guzzle या अन्य निर्भरता के एक (अलग संस्करण) का उपयोग कर सकते हैं), इसलिए यह जानकारी बनाना अच्छा है एक निर्णय जिसके बारे में समाधान सबसे मजबूत होगा
आर्टफ्लोरोबॉट

26

यदि आप इस तरह से जा रहे हैं तो एक और CURL विधि है।

एक बार जब आप PHP कर्ल एक्सटेंशन काम करते हैं, तो सेटटॉप () कॉल के साथ विभिन्न झंडों को मिलाते हुए, यह बहुत सीधा होता है। इस उदाहरण में मुझे एक वेरिएबल $ xml मिला है जिसे XML मैंने भेजने के लिए तैयार किया है - मैं उस सामग्री को पोस्ट करने जा रहा हूं उदाहरण के परीक्षण विधि।

$url = 'http://api.example.com/services/xmlrpc/';
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);
//process $response

पहले हमने कनेक्शन को इनिशियलाइज़ किया, फिर हमने सेटटॉप () का उपयोग करके कुछ विकल्प निर्धारित किए। ये PHP को बताते हैं कि हम एक पोस्ट अनुरोध कर रहे हैं, और यह कि हम इसके साथ कुछ डेटा भेज रहे हैं, डेटा की आपूर्ति कर रहे हैं। CURLOPT_RETURNTRANSFER ध्वज कर्ल को आउटपुट देने के बजाय हमें कर्ल_टेसेक के रिटर्न मान के रूप में आउटपुट देने के लिए कहता है। फिर हम कॉल करते हैं और कनेक्शन बंद करते हैं - परिणाम $ प्रतिक्रिया में है।


1
3 कर्ल_सेटॉप () कॉल में, पहला आर्ग सही $chनहीं होना चाहिए $curl?
jcomeau_ictx

क्या आप POST JSON डेटा के लिए इसी कोड का उपयोग कर सकते हैं? लेकिन $ xml को $ json (जहाँ $ json शायद एक JSON स्ट्रिंग है) के साथ बदलें
नील डेविस

24

यदि आप अपने ऐप को विकसित करने के लिए किसी भी मौके पर Wordpress का उपयोग कर रहे हैं (यह वास्तव में प्राधिकरण प्राप्त करने के लिए एक सुविधाजनक तरीका है, जानकारी पृष्ठों आदि भी बहुत सरल सामान के लिए), तो आप निम्नलिखित स्निपेट का उपयोग कर सकते हैं:

$response = wp_remote_post( $url, array('body' => $parameters));

if ( is_wp_error( $response ) ) {
    // $response->get_error_message()
} else {
    // $response['body']
}

यह वेब सर्वर पर उपलब्ध है के आधार पर वास्तविक HTTP अनुरोध बनाने के विभिन्न तरीकों का उपयोग करता है। अधिक जानकारी के लिए, HTTP एपीआई प्रलेखन देखें

यदि आप Wordpress इंजन को शुरू करने के लिए एक कस्टम थीम या प्लगइन विकसित नहीं करना चाहते हैं, तो आप Wordpress रूट में एक अलग PHP फ़ाइल में बस निम्न कर सकते हैं:

require_once( dirname(__FILE__) . '/wp-load.php' );

// ... your code

यह किसी भी विषय या किसी भी HTML उत्पादन नहीं दिखाएगा, बस Wordpress एपीआई के साथ दूर हैक!


22

मैं फ्रेड टैन्रिकुत के कर्ल-आधारित उत्तर के बारे में कुछ विचार जोड़ना चाहूंगा। मुझे पता है कि उनमें से अधिकांश पहले से ही ऊपर दिए गए उत्तरों में लिखे गए हैं, लेकिन मुझे लगता है कि एक जवाब दिखाना एक अच्छा विचार है जिसमें सभी को एक साथ शामिल किया गया है।

यहाँ वह श्रेणी है जो मैंने HTTP-GET / POST / PUT / DELETE अनुरोध को कर्ल के आधार पर बनाने के लिए लिखी थी, केवल प्रतिक्रिया निकाय के बारे में:

class HTTPRequester {
    /**
     * @description Make HTTP-GET call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPGet($url, array $params) {
        $query = http_build_query($params); 
        $ch    = curl_init($url.'?'.$query);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-POST call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPost($url, array $params) {
        $query = http_build_query($params);
        $ch    = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-PUT call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPut($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'PUT');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
    /**
     * @category Make HTTP-DELETE call
     * @param    $url
     * @param    array $params
     * @return   HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPDelete($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
}

सुधार

  • अनुरोध-सरणी से क्वेरी-स्ट्रिंग प्राप्त करने के लिए http_build_query का उपयोग करना। (आप स्वयं भी सरणी का उपयोग कर सकते हैं, इसलिए देखें: http://php.net/manual/en/function.curl-setopt.php )
  • इसे प्रतिध्वनित करने के बजाए प्रतिक्रिया लौटाते हुए। Btw आप लाइन curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, सच) को हटाकर वापसी से बच सकते हैं ; । उसके बाद वापसी मूल्य एक बूलियन है (सही = अनुरोध सफल था अन्यथा एक त्रुटि हुई) और प्रतिक्रिया प्रतिध्वनित होती है। देखें: http://php.net/en/manual/function.curl-exec.php
  • कर्ल_क्लोज़ का उपयोग करके कर्ल-हैंडलर का क्लिनिंग सत्र समापन और विलोपन । देखें: http://php.net/manual/en/function.curl-close.php
  • किसी भी नंबर का उपयोग करने के बजाय कर्ल_सेटॉप फ़ंक्शन के लिए बूलियन मानों का उपयोग करना । (मुझे पता है कि किसी भी संख्या को शून्य नहीं के बराबर भी माना जाता है, लेकिन सच का उपयोग अधिक पठनीय कोड उत्पन्न करता है, लेकिन यह सिर्फ मेरी राय है)
  • HTTP-PUT / DELETE कॉल करने की क्षमता (उपयोगी सेवा परीक्षण के लिए उपयोगी)

उपयोग का उदाहरण

प्राप्त

$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));

पद

$response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar"));

डाल

$response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar"));

हटाएँ

$response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar"));

परिक्षण

आप इस सरल वर्ग का उपयोग करके कुछ शांत सेवा परीक्षण भी कर सकते हैं।

class HTTPRequesterCase extends TestCase {
    /**
     * @description test static method HTTPGet
     */
    public function testHTTPGet() {
        $requestArr = array("getLicenses" => 1);
        $url        = "http://localhost/project/req/licenseService.php";
        $this->assertEquals(HTTPRequester::HTTPGet($url, $requestArr), '[{"error":false,"val":["NONE","AGPL","GPLv3"]}]');
    }
    /**
     * @description test static method HTTPPost
     */
    public function testHTTPPost() {
        $requestArr = array("addPerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPost($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPPut
     */
    public function testHTTPPut() {
        $requestArr = array("updatePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPut($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPDelete
     */
    public function testHTTPDelete() {
        $requestArr = array("deletePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPDelete($url, $requestArr), '[{"error":false}]');
    }
}

मेरे लिए, यह कहते हैं "अनकवर्ड एरर: अपरिभाषित विधि से कॉल करें HTTPRequester :: HTTPost ()" । मैंने केवल आपकी .php फ़ाइल में आपकी कक्षा चिपकाई है। मुझे कुछ और करने की ज़रूरत है?
०४ पर

1
क्या आप कृपया अपना कोड पोस्ट कर सकते हैं? किसी भी कोड स्निपेट के बिना क्या गलत है, इसका अनुमान लगाना बहुत कठिन है।
mwatzer 23

जैसा कि मैंने कहा, मैंने आपको अपनी सादे php फाइल में शाब्दिक रूप से कॉपी किया है और इसने मुझे यह त्रुटि दी है।
LinusGeffarth

1
ठीक है अब मैं इस मुद्दे को देखता हूं, .. यह उदाहरण में गलत था! आपको HTTPRequester के बजाय HTTPRequester :: HTTPPost () HTTPRequester :: HTTPost ()
mwatzer

1
आह। कि एक आसान याद आती है। मुझे अतिरिक्त पी स्पॉट करने से पहले मुझे 5x जैसी आपकी टिप्पणी पढ़नी थी । धन्यवाद!
लिनसग्राफार्थ

19

उपरोक्त कर्ल-कम विधि का एक अन्य विकल्प देशी स्ट्रीम फ़ंक्शन का उपयोग करना है :

  • stream_context_create():

    ऑप्शन प्रीसेट में दिए गए किसी भी विकल्प के साथ एक स्ट्रीम संदर्भ बनाता है और देता है ।

  • stream_get_contents():

    को file_get_contents()छोड़कर, stream_get_contents() पहले से ही खुले स्ट्रीम संसाधन पर काम करता है और अधिकतम स्ट्रिंग बाइट्स में और शेष ऑफसेट पर शुरू करके , शेष सामग्री लौटाता है ।

इनके साथ एक POST फ़ंक्शन बस इस तरह हो सकता है:

<?php

function post_request($url, array $params) {
  $query_content = http_build_query($params);
  $fp = fopen($url, 'r', FALSE, // do not use_include_path
    stream_context_create([
    'http' => [
      'header'  => [ // header array does not need '\r\n'
        'Content-type: application/x-www-form-urlencoded',
        'Content-Length: ' . strlen($query_content)
      ],
      'method'  => 'POST',
      'content' => $query_content
    ]
  ]));
  if ($fp === FALSE) {
    return json_encode(['error' => 'Failed to get contents...']);
  }
  $result = stream_get_contents($fp); // no maxlength/offset
  fclose($fp);
  return $result;
}

1
यह CURL- कम विधि ने मुझे google से reCAPTCHA को मान्य करने के लिए ठीक काम किया। यह उत्तर इस Google कोड के साथ परिवर्तित होता है: github.com/google/recaptcha/blob/master/src/ReCaptcha/…
Xavi Montero

1
आप उपयोग की जरूरत नहीं है fclose()अगर $fpहै false। क्योंकि fclose()उम्मीद है कि एक संसाधन पैरामीटर है।
फ्लोरिस

1
@Floris ने इसे अभी संपादित किया है और वास्तव में fclose डॉक्स का उल्लेख है "फ़ाइल पॉइंटर मान्य होना चाहिए"। ध्यान देने के लिए धन्यवाद!
CPHPython 16

8

भेजने GETया POSTअनुरोध करने का बेहतर तरीका PHPनीचे दिया गया है:

<?php
    $r = new HttpRequest('http://example.com/form.php', HttpRequest::METH_POST);
    $r->setOptions(array('cookies' => array('lang' => 'de')));
    $r->addPostFields(array('user' => 'mike', 'pass' => 's3c|r3t'));

    try {
        echo $r->send()->getBody();
    } catch (HttpException $ex) {
        echo $ex;
    }
?>

कोड यहाँ आधिकारिक दस्तावेज से लिया गया है http://docs.php.net/manual/da/httprequest.send.pp


1
@akinuri हाइलाइट करने के लिए धन्यवाद, मैं नया साझा करने जा रहा हूं।
इमरान जहूर

PHP 5x पर कैसे करें?

@YumYumYum कृपया 5x के लिए ऊपर दिए गए dbau के उत्तर की जांच करें जो इस तकनीक का उपयोग करता है php.net/manual/en/function.stream-context-create.php या आप हमेशा मानक क्यूरल समाधान पर वापस जा सकते हैं।
इमरान ज़हूर

5

एक और है जो आप उपयोग कर सकते हैं

<?php
$fields = array(
    'name' => 'mike',
    'pass' => 'se_ret'
);
$files = array(
    array(
        'name' => 'uimg',
        'type' => 'image/jpeg',
        'file' => './profile.jpg',
    )
);

$response = http_post_fields("http://www.example.com/", $fields, $files);
?>

जानकारी के लिए यहाँ क्लिक करें


2
यह एक PECL एक्सटेंशन पर निर्भर करता है, जिसे अधिकांश ने स्थापित नहीं किया होगा। यह भी सुनिश्चित नहीं है कि यह अभी भी उपलब्ध है, क्योंकि मैनुअल पेज हटा दिए गए हैं।
miken32

5

मैं इसी तरह की समस्या की तलाश में था और ऐसा करने का एक बेहतर तरीका पाया। तो यहाँ यह जाता है।

आप केवल निम्नलिखित पंक्ति को पुनर्निर्देशन पृष्ठ पर (पृष्ठ 1 कह सकते हैं।

header("Location: URL", TRUE, 307); // Replace URL with to be redirected URL, e.g. final.php

मुझे REST API कॉल के लिए POST अनुरोधों को पुनर्निर्देशित करने की आवश्यकता है । यह समाधान पोस्ट डेटा के साथ-साथ कस्टम हेडर मूल्यों के साथ पुनर्निर्देशित करने में सक्षम है।

यहाँ संदर्भ लिंक है


1
यह जवाब कैसे एक पृष्ठ अनुरोध को रीडायरेक्ट नहीं मैं PHP के साथ एक पोस्ट अनुरोध कैसे भेजूं? यकीन है कि यह किसी भी POST मापदंडों को आगे बढ़ाएगा लेकिन यह सब समान नहीं है
वेस्ली स्मिथ

@ DelightedD0D, क्षमा करें, मुझे redirect a page request with POST paramबनाम के बीच अंतर नहीं मिला send POST request। मेरे लिए दोनों का उद्देश्य समान है, अगर मैं गलत हूं तो मुझे सुधारो।
अरिंदम नायक

1
क्या कोई तरीका है जो मुझे POST विधि के साथ पैरामीटर भेजेगा और फिर PHP के माध्यम से सामग्री पढ़ेगा? ओपी चाहता है कि POST मापदंडों के एक सेट का निर्माण करने के लिए उनकी php स्क्रिप्ट हो और उन्हें उस पृष्ठ से आउटपुट प्राप्त करने के लिए दूसरे php पृष्ठ पर और उनकी स्क्रिप्ट के लिए भेजना चाहिए। यह समाधान केवल मूल्यों के पहले से ही स्थापित सेट को स्वीकार करेगा और उन्हें दूसरे पृष्ठ पर भेज देगा। वे बहुत अलग हैं।
वेस्ले स्मिथ

5

यहाँ cURL के बिना सिर्फ एक कमांड का उपयोग किया जा रहा है। सुपर सिंपल है।

echo file_get_contents('https://www.server.com', false, stream_context_create([
    'http' => [
        'method' => 'POST',
        'header'  => "Content-type: application/x-www-form-urlencoded",
        'content' => http_build_query([
            'key1' => 'Hello world!', 'key2' => 'second value'
        ])
    ]
]));

Key2 कैसे काम करेगा? उनके बीच क्या अलग है?
मुहम्मद इदरीस

@ कीवर्ड जोड़ने के लिए, आप इसे दूसरी सरणी आइटम के रूप में दर्ज कर सकते हैं। 'की 1' => 'हैलो वर्ल्ड!', 'की 2' => 'दूसरी वैल्यू'
लीगा

जैपियर के साथ उपयोग करते समय यह बहुत अच्छा काम करता है।
मोक्सेट जान

3

आसानी से POST अनुरोध भेजने के लिए PEAR का HTTP_Request2 पैकेज आज़माएं । वैकल्पिक रूप से, आप PHP के कर्ल फ़ंक्शन का उपयोग कर सकते हैं या PHP स्ट्रीम संदर्भ का उपयोग कर सकते हैं ।

HTTP_Request2 सर्वर को मॉक आउट करना संभव बनाता है , जिससे आप अपने कोड को आसानी से यूनिट-टेस्ट कर सकते हैं


7
यदि संभव हो तो मैं इसे विस्तृत रूप से देखना चाहूंगा।
गुई इमामुरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.