• 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)
  • 相关阅读:
    js 模块循环加载
    英文
    浏览器
    ecma
    Speaking JavaScript
    es6 exploringjs 2
    es6 兼容性
    es6 中文
    Exploring ES6
    探索ES6(ES2015)
  • 原文地址:https://www.cnblogs.com/jixingke/p/8486158.html
Copyright © 2020-2023  润新知