PHP+कर्ल, HTTP पोस्ट नमूना कोड?




curl http-post (8)

क्या कोई मुझे दिखा सकता है कि HTTP पोस्ट के साथ php कर्ल कैसे करें?

मैं इस तरह के डेटा भेजना चाहता हूँ:

username=user1, password=passuser1, gender=1

www.domain.com

मैं उम्मीद करता हूं कि कर्ल result=OK जैसे प्रतिक्रिया वापस कर देगा। क्या कोई उदाहरण हैं?


HTTP पोस्ट करने के लिए php curl_exec का उपयोग करने का एक लाइव उदाहरण:

इसे foobar.php नामक फ़ाइल में रखें:

<?php
  $ch = curl_init();
  $skipper = "luxury assault recreational vehicle";
  $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash');
  $postvars = '';
  foreach($fields as $key=>$value) {
    $postvars .= $key . "=" . $value . "&";
  }
  $url = "http://www.google.com";
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST, 1);                //0 for a get request
  curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
  curl_setopt($ch,CURLOPT_TIMEOUT, 20);
  $response = curl_exec($ch);
  print "curl response is:" . $response;
  curl_close ($ch);
?>

फिर इसे php foobar.php कमांड के साथ php foobar.php , यह इस प्रकार के आउटपुट को स्क्रीन पर डंप करता है:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Title</title>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
  A mountain of content...
</body>
</html>

तो आपने www.google.com पर एक PHP पोस्ट किया और इसे कुछ डेटा भेजा।

अगर सर्वर को पोस्ट वैरिएबल में पढ़ने के लिए प्रोग्राम किया गया था, तो यह उस पर आधारित कुछ अलग करने का फैसला कर सकता था।


इसे आसानी से पहुंचा जा सकता है:

<?php

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
var_export($response);

कर्ल पोस्ट + त्रुटि हैंडलिंग + सेट हेडर [@ mantas-d के लिए धन्यवाद]:

function curlPost($url, $data=NULL, $headers = NULL) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if(!empty($data)){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $response = curl_exec($ch);

    if (curl_error($ch)) {
        trigger_error('Curl Error:' . curl_error($ch));
    }

    curl_close($ch);
    return $response;
}


curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);

चूंकि यह धागा php में कर्ल के साथ पोस्ट भेजने के लिए Google के परिणामों में उच्च है, इसलिए मैं सबसे अधिक वैध उत्तर देना चाहता हूं क्योंकि ऊपर और नीचे सभी अन्य अनावश्यक काम करते हैं, जबकि उत्तर बहुत सरल है:

प्रक्रियात्मक

// set post fields
$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];

$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

// execute!
$response = curl_exec($ch);

// close the connection, release resources used
curl_close($ch);

// do anything you want with your response
var_dump($response);

वस्तु के उन्मुख

<?php
namespace MyApp\Http;

class Curl
{
    /** @var resource cURL handle */
    private $ch;

    /** @var mixed The response */
    private $response = false;

    /**
     * @param string $url
     * @param array  $options
     */
    public function __construct($url, array $options = array())
    {
        $this->ch = curl_init($url);

        foreach ($options as $key => $val) {
            curl_setopt($this->ch, $key, $val);
        }

        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
    }

    /**
     * Get the response
     * @return string
     * @throws \RuntimeException On cURL error
     */
    public function getResponse()
    {
         if ($this->response) {
             return $this->response;
         }

        $response = curl_exec($this->ch);
        $error    = curl_error($this->ch);
        $errno    = curl_errno($this->ch);

        if (is_resource($this->ch)) {
            curl_close($this->ch);
        }

        if (0 !== $errno) {
            throw new \RuntimeException($error, $errno);
        }

        return $this->response = $response;
    }

    /**
     * Let echo out the response
     * @return string
     */
    public function __toString()
    {
        return $this->getResponse();
    }
}

// usage
$curl = new \MyApp\Http\Curl('http://www.example.com', array(
    CURLOPT_POSTFIELDS => array('username' => 'user1')
));

try {
    echo $curl;
} catch (\RuntimeException $ex) {
    die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}

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

एचटीटीपीएस / एन्क्रिप्टिंग यातायात का उपयोग करना

आमतौर पर विंडोज ऑपरेटिंग सिस्टम के तहत PHP में curl के साथ एक समस्या है। एक https संरक्षित एंडपॉइंट से कनेक्ट करने का प्रयास करते समय, आपको एक त्रुटि मिल जाएगी कि certificate verify failed

यहां अधिकांश लोग कर्ल लाइब्रेरी को प्रमाणपत्र त्रुटियों को अनदेखा करने और जारी रखने के लिए curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); )। चूंकि यह आपके कोड को काम करेगा, आप विशाल सुरक्षा छेद पेश करते हैं और दुर्भावनापूर्ण उपयोगकर्ताओं को आपके ऐप पर विभिन्न हमलों को करने में सक्षम करते हैं जैसे मैन इन द मिडल अटैक या ऐसे।

कभी नहीं, कभी ऐसा करो। इसके बजाए, आपको बस अपनी php.ini को संशोधित करने और PHP को बताए जाने की आवश्यकता है जहां आपकी CA Certificate फ़ाइल प्रमाणपत्र को सही तरीके से सत्यापित करने देती है:

; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem

नवीनतम cacert.pem इंटरनेट से डाउनलोड किया जा सकता है या आपके पसंदीदा ब्राउज़र से निकाला जा सकता है । किसी भी php.ini से संबंधित सेटिंग्स को बदलते समय अपने वेबसर्वर को पुनरारंभ करना याद रखें।


यदि आप कुकीज के साथ साइट पर लॉगिन करने का प्रयास करते हैं।

यह कोड:

if ($server_output == "OK") { ... } else { ... }

यदि आप लॉगिन करने का प्रयास करते हैं तो काम नहीं कर सकता है, क्योंकि कई साइटें 200 स्थिति लौटाती हैं, लेकिन पोस्ट सफल नहीं है।

यह जांचने का आसान तरीका है कि लॉगिन पोस्ट सफल है या नहीं, यह जांचें कि क्या यह कुकीज़ को फिर से सेट करता है या नहीं। अगर आउटपुट में सेट-कुकीज स्ट्रिंग है, तो इसका मतलब है कि पोस्ट सफल नहीं हैं और यह नया सत्र शुरू करता है।

पोस्ट भी सफल हो सकता है, लेकिन स्थिति 200 के बजाय रीडायरेक्ट किया जा सकता है।

यह सुनिश्चित करने के लिए कि पोस्ट सफल है, इसे आजमाएं:

पोस्ट के बाद स्थान का पालन करें, इसलिए यह उस पृष्ठ पर जाएगा जहां पोस्ट रीडायरेक्ट करता है:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

और अनुरोध में मौजूद नई कुकीज़ जांचने के लिए:

if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output)) 

{echo 'post successful'; }

else { echo 'not successful'; }

यदि फॉर्म रीडायरेक्ट्स, प्रमाणीकरण, कुकीज़, एसएसएल (https), या पोस्ट वैरिएबल की अपेक्षा पूरी तरह से खुली स्क्रिप्ट के अलावा अन्य कुछ भी उपयोग कर रहा है, तो आप अपने दांतों को वास्तव में जल्दी से शुरू करने जा रहे हैं। Snoopy पर एक नज़र डालें, जो बहुत सारे ओवरहेड को स्थापित करने की आवश्यकता को हटाते समय आपके मन में ठीक है।


<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "postvar1=value1&postvar2=value2&postvar3=value3");

// in real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS, 
//          http_build_query(array('postvar1' => 'value1')));

// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec ($ch);

curl_close ($ch);

// further processing ....
if ($server_output == "OK") { ... } else { ... }

?>

curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);


function curlPost($url, $data) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($ch);
    if (curl_error($ch)) {
        throw new \Exception(curl_error($ch));
    }
    curl_close($ch);

    return $response;
}




http-post