Skip to content

Php

php
<?php
// 定义常量:AK、SK、域名地址
define('AK','你的ak值');
define('SK','你的sk值');
define('HOST','https://api.niulinkcloud.com');

// get方法执行入口
get();

// post方法执行入口
post();

// get请求:用/v1/vendorclaimablebw作为demo
function get(){
    // 1、构建http url
    $api = HOST."/v1/vendorclaimablebw";
    $contentType = 'application/form';
    $query = [
        'province'          =>          '河南',
        'isp'               =>          '移动',
        'usbw'              =>          '1024',
        'bwNum'             =>          '5',
        'natType'           =>          'public',
        'dialType'          =>          'serverDial'
    ];
    $url = $api.'?'.http_build_query($query);

    // 2、构建http header
    $token = get_token($url,"GET");
    $header = array(
        "Authorization: $token",
        "Content-Type: $contentType"
    );

    // 3、发起http请求
    $res = do_curl($url, $header, "GET", NULL);

    print_r($res);
}

// post请求:用/v1/nodes/stats接口作为demo
function post(){
    // 1、组装htt url
    $api = HOST."/v1/nodes/stats";

    // 2、构建http request body
    $nodeIDs = [
        '你的节点ID值'
    ];
    $body = [
        'nodeIDs'           =>      json_encode($nodeIDs),
        'start'             =>      '2024-12-12',
        'end'               =>      '2024-12-13',
    ];

    // 3、构建http header
    $contentType = 'application/json';
    $token = get_token($api,"POST", $contentType, $body);
    $header = array(
        "Authorization: $token",
        "Content-Type: $contentType"
    );

    // 4、发起http请求
    $res = do_curl($api, $header, "POST", $body);

    print_r($res);
}

function do_curl($url, $header, $method, $data = NULL) {
    // 创建curl会话的句柄
    $curl = curl_init();

    // 设置 http url
    curl_setopt($curl, CURLOPT_URL, $url);

    // 设置 http timeout,单位为秒
    curl_setopt($curl, CURLOPT_TIMEOUT, 300);

    if ($method == "POST") {
        curl_setopt($curl, CURLOPT_POST, 1);
    } else if ($method == "PUT" || $method == "DELETE") {
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    }

    // 如果$data存在且非空的情况下,设置请求的body数据
    if ($data) {
        if (is_array($data)) {
            $data = json_encode($data);
        }
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }

    // 设置 http header
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

    // 当设置为 true 或 1 时,curl_exec() 将返回请求的响应数据,而不是直接输出
    // 当设置为 false 或 0 时,curl_exec() 将直接输出响应数据,而不返回
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    // 发起http请求
    $res = curl_exec($curl);

    // 获取http status code
    $http_code = curl_getinfo($curl)['http_code'];

    switch ($http_code){
        case 200:
            return ['code'=>1,'msg'=>'操作成功','data'=>json_decode($res,true)];
            break;
        case 400:
        case 500:
            return json_decode($res,true);
            break;
    }

    curl_close($curl);

    return ['code'=>0,'msg'=>'未知错误','data'=>[]];
}

// 获取签名token
function get_token($url, $method, $contentType='', $body=[]) {
    // 解析url:url通常由域名、path、queryParam组成
    $urlItems = parse_url($url);

    // 获取path
    $path = '';
    if (array_key_exists('path', $urlItems)) {
        $path = $urlItems['path'];
    }

    // 获取查询参数
    $query = '';
    if (array_key_exists('query', $urlItems)) {
        $query = '?' . $urlItems['query'];
    }

    if ($method == "GET") {
        $data = $path;
        if ($query) {
            $data .= $query;
        }
        $data .= "\n";
    } else {
        $host = $urlItems['host'];

        if (isset($urlItems['port'])) {
            $port = $urlItems['port'];
        } else {
            $port = '';
        }

        // 1、拼接请求方法、path
        $data = $method . ' ' . $path;

        // 2、拼接queryParam
        if (!empty($query)) {
            $data .= '?' . $query;
        }

        // 3、拼接host
        $data .= "\nHost: " . $host;

        // 4、拼接端口
        if (!empty($port)) {
            $data .= ":" . $port;
        }

        // 5、拼接contentType
        if (!empty($contentType)) {
            $data .= "\nContent-Type: " . $contentType;
        }

        // 6、固定拼接\n\n
        $data .= "\n\n";

        // 7、最后拼接body
        if (!empty($body)) {
            $data .= json_encode($body);
        }
    }

    // 使用sha1进行签名
    $hmac = hash_hmac('sha1', $data, SK, true);

    $prefix = 'Qiniu ';
    if ($method == 'GET') {
        $prefix = 'QBox ';
    }

    // str_replace 函数可以用来替换字符串中的字符
    // 使用base64_encode进行编码时,得到一个使用 base64字符集的字符串,该字符集包括字母 A-Z、a-z、数字 0-9,以及 '+' 和 '/' 字符。
    // 为满足URL安全的要求或避免在URL中出现特殊字符,需要将结果中的'+'和'/'字符替换为其他字符'-' 和'_'
    $find = array('+', '/');
    $replace = array('-', '_');

    return  $prefix . AK . ':' . str_replace($find, $replace, base64_encode($hmac));
}