PHP + curl, HTTP POST sample code?

前端 未结 11 2348
北荒
北荒 2020-11-21 04:58

Can anyone show me how to do a php curl with an HTTP POST?

I want to send data like this:

username=user1, password=passuser1, gender=1
相关标签:
11条回答
  • 2020-11-21 05:44
    <?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 { ... }
    ?>
    
    0 讨论(0)
  • 2020-11-21 05:44

    Examples of sending form and raw data:

    $curlHandler = curl_init();
    
    curl_setopt_array($curlHandler, [
        CURLOPT_URL => 'https://postman-echo.com/post',
        CURLOPT_RETURNTRANSFER => true,
    
        /**
         * Specify POST method
         */
        CURLOPT_POST => true,
    
        /**
         * Specify array of form fields
         */
        CURLOPT_POSTFIELDS => [
            'foo' => 'bar',
            'baz' => 'biz',
        ],
    ]);
    
    $response = curl_exec($curlHandler);
    
    curl_close($curlHandler);
    
    echo($response);
    
    0 讨论(0)
  • 2020-11-21 05:46

    Curl Post + Error Handling + Set Headers [thanks to @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',
    ]);
    
    0 讨论(0)
  • 2020-11-21 05:50
    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);
        $error = curl_error($ch);
        curl_close($ch);
        if ($error !== '') {
            throw new \Exception($error);
        }
    
        return $response;
    }
    
    0 讨论(0)
  • 2020-11-21 05:51

    Procedural

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

    Object oriented

    <?php
    
    // mutatis mutandis
    namespace MyApp\Http;
    
    class CurlPost
    {
        private $url;
        private $options;
               
        /**
         * @param string $url     Request URL
         * @param array  $options cURL options
         */
        public function __construct($url, array $options = [])
        {
            $this->url = $url;
            $this->options = $options;
        }
    
        /**
         * Get the response
         * @return string
         * @throws \RuntimeException On cURL error
         */
        public function __invoke(array $post)
        {
            $ch = \curl_init($this->url);
            
            foreach ($this->options as $key => $val) {
                \curl_setopt($ch, $key, $val);
            }
    
            \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
            \curl_setopt($ch, \CURLOPT_POSTFIELDS, $post);
    
            $response = \curl_exec($ch);
            $error    = \curl_error($ch);
            $errno    = \curl_errno($ch);
            
            if (\is_resource($ch)) {
                \curl_close($ch);
            }
    
            if (0 !== $errno) {
                throw new \RuntimeException($error, $errno);
            }
            
            return $response;
        }
    }
    

    Usage

    // create curl object
    $curl = new \MyApp\Http\CurlPost('http://www.example.com');
    
    try {
        // execute the request
        echo $curl([
            'username' => 'user1',
            'password' => 'passuser1',
            'gender'   => 1,
        ]);
    } catch (\RuntimeException $ex) {
        // catch errors
        die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
    }
    

    Side note here: it would be best to create some kind of interface called AdapterInterface for example with getResponse() method and let the class above implement it. Then you can always swap this implementation with another adapter of your like, without any side effects to your application.

    Using HTTPS / encrypting traffic

    Usually there's a problem with cURL in PHP under the Windows operating system. While trying to connect to a https protected endpoint, you will get an error telling you that certificate verify failed.

    What most people do here is to tell the cURL library to simply ignore certificate errors and continue (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);). As this will make your code work, you introduce huge security hole and enable malicious users to perform various attacks on your app like Man In The Middle attack or such.

    Never, ever do that. Instead, you simply need to modify your php.ini and tell PHP where your CA Certificate file is to let it verify certificates correctly:

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

    The latest cacert.pem can be downloaded from the Internet or extracted from your favorite browser. When changing any php.ini related settings remember to restart your webserver.

    0 讨论(0)
提交回复
热议问题