## curl請求http接口
```
<?php
namespace app\index\controller;
use think\Controller;
class Api extends Controller
{
const KEY = 'aaaaaaaaaaaaaaaaaaaaaaaa';
const APPID = 'bbbbbbbbbbbbbbbbbbbbbb';
const URL = 'https://api.test.com/api/gatdata';
//輸出接口(get請求)
public function getData(){
//隨機數
$randomStr = $this -> createNonceStr();
//接口方的appid
$appid = self::APPID;
//接口名
$api = 'abcd';
//生成簽名
$arr = array();
$arr['nonce'] = "nonce=$randomStr";
$arr['api'] = "api=$api";
$signature = $this -> arithmetic($arr);
//請求地址
$url = self::URL;
//請求體
$query = [
'api'=>$api,
'nonce'=>$randomStr,
'sign'=>$signature
];
//get
$result = json_decode($this -> httpGet($url,$appid,$query),true);
//返回請求數據
return json(['data'=>$result]);
}
//輸出接口(post)
public function postData(){
//隨機數
$randomStr = $this -> createNonceStr();
$appid = self::APPID;
$api = 'abcd';
//生成簽名
$arr = array();
$arr['nonce'] = "nonce=$randomStr";
$arr['api'] = "api=$api";
$signature = $this -> arithmetic($arr);
//url地址
$url = self::URL;
//請求體
$body = [
'api'=>$api,
'nonce'=>$randomStr,
'sign'=>$signature,
];
//post
$result = $this -> httpPost($url,$appid,$body);
return json(['data'=>$result]);
}
//curl模擬get請求。
private function httpGet($url,$appid,$query){
//初始化
$curl = curl_init();
$headers = array();
//微秒時間戳
$time = microtime();
list($msec, $sec) = explode(' ', $time);
//毫秒時間戳
$msectime = (int)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
//頭部字段(自定義)
$headers[] = "app_id:$appid";
$headers[] = "psd_entry:$msectime";
//將數組轉化為字符串參數
$query = http_build_query($query);
//將請求的參數拼接在url后面
$url = $url.'?'.$query;
//需要請求的是哪個地址
curl_setopt($curl,CURLOPT_URL,$url);
//表示把請求的數據已文件流的方式輸出到變量中
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//繞過ssl驗證
//參數為0表示不帶頭文件,為1表示帶頭文件
curl_setopt($curl, CURLOPT_HEADER,0);
//頭部字段
curl_setopt($curl, CURLOPT_HTTPHEADER,$headers);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
//curl模擬post請求。
private static function httpPost($url,$appid,$body){
$curl = curl_init();
$headers = array();
$time = microtime();
list($msec, $sec) = explode(' ', $time);
$msectime = (int)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
//頭部字段(自定義)
$headers[] = "app_id:$appid";
$headers[] = "psd_entry:$msectime";
//設置提交的url
curl_setopt($curl, CURLOPT_URL, $url);
//設置頭文件的信息作為數據流輸出
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER,$headers);
//設置獲取的信息以文件流的形式返回,而不是直接輸出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//設置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
//添加post數據
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
//執行命令
$data = curl_exec($curl);
//關閉URL請求
curl_close($curl);
//獲得數據并返回
return $data;
}
//隨機生成字符串
private function createNonceStr($length = 16) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/**
* @param $timeStamp 時間戳
* @param $randomStr ASCII可見字符串
* @return string 返回簽名
*/
private function arithmetic($arr){
$key = self::KEY;
//按照首字母大小寫順序排序
sort($arr,SORT_STRING);
//拼接成字符串
$str = implode('&',$arr);
//拼接key
$stringSignTemp = $str.'&key='.$key;
//生成簽名
$sign=strtoupper(MD5($stringSignTemp));
return $sign;
}
}
```