zoukankan      html  css  js  c++  java
  • php中使用curl来post一段json数据

     场景:在调用第三方接口时经常需要使用到curl进行数据交互,在初次使用时遇到一些小问题,记录下来随时查阅。

    封装curl相关方法便于使用,方法如下:

    /**
     * @param $url
     * @param string $error
     * @param array|string $post
     * @param int $timeout
     * @param null $ref
     * @param string $ua
     * @param $contentType
     * @return bool|mixed
     */
    function xcurl($url, &$error = "", $post = array(), $timeout = 5, $ref = null, $ua = "Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre", $contentType) {
        $ch           = curl_init();
    
        if(!empty($ref)) {
            curl_setopt($ch, CURLOPT_REFERER, $ref);
        }
    
        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    
        if (false !== stripos($url, "https://")) {                # https处理,不校验相关证书
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        }
    
        if(!empty($ua)) {
            curl_setopt($ch, CURLOPT_USERAGENT, $ua);
        }
    
        if(count($post) > 0){
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        }
    
        if ('json' == $contentType) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($post)));
        }
    
        $output       = curl_exec($ch);
        if ($output === false) {
            $error    = curl_error($ch);
            curl_close($ch);
            return false;
        } else {
            curl_close($ch);
            return $output;
        }
    }

    调用如下:

    <?
    
    $url = 'localhost/php/server.php';
    $error = '';
    $post = [
        'hello' => 'world',
        'lang' => 'php',
    ];
    $post = json_encode($post);
    
    $result = xcurl($url,$error, $post, 5, null, 'Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre', 'json');
    
    var_dump($result);
    

    本地服务接受参数时遇到了问题,无论$_POST还是$_REQUEST都无法获取curl客户端发送的json,所以改用file_get_contents来获取,代码:

    print_r(file_get_contents('php://input'));

    最终请求curl.php获取到结果为:

    /code/php/curl.php:19:string

     '{"hello":"world","lang":"php"}' (length=30)
  • 相关阅读:
    【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    107. Binary Tree Level Order Traversal II
    109. Convert Sorted List to Binary Search Tree
    108. Convert Sorted Array to Binary Search Tree
    110. Balanced Binary Tree
    STL容器迭代器失效问题讨论
    113. Path Sum II
    112. Path Sum
  • 原文地址:https://www.cnblogs.com/jixingke/p/8486158.html
Copyright © 2011-2022 走看看