有三个方法
- 发送请求 中间处理
- curl请求
- 写入/修改日志
直接上代码
/**
* 发送请求 中间处理
* @param string $name 方法名/动作类型
* @param string $method 请求方法
* @param string $data 请求/响应数据
* @param array $edit_log 需要修改的日志数据
* @param int $log_id 日志ID
* @param int $is_add 默认为添加日志,为0 则修改日志
* @param int $needToken false:平台 true:用户
* @param bool $globalToken 是否生成全局Token
* @param bool $returnStream 是否生成流文件
* @param int $headers header头格式
* @return array
* @throws \think\db\exception\DbException
*/
private static function handle( $name = '', $method = 'POST', $data = '', $edit_log = [], $log_id = 0, $is_add = 1, $needToken = 1, $globalToken = true, $returnStream = false, $headers = 0, $is_json = false)
{
if ( !$is_json)
{
$data = json_encode( $data, JSON_UNESCAPED_UNICODE);
}
// 修改日志信息
if( !$is_add && !empty( $edit_log) && !in_array( $name, self::$no_log)) {
$log_data = [
'response' => $data,
'res_date' => date( 'Y-m-d H:i:s')
];
$new_log = array_merge( $log_data, $edit_log);
self::log( $new_log, $log_id);
return [];
}
// 写入日志
if( $is_add && !in_array( $name, self::$no_log))
{
$log_data = [
'action' => $name,
'action_turn' => self::$action_turn[$name],
'ip' => get_ip(),
'success' => 0,
'request' => $data,
'req_date' => date( 'Y-m-d H:i:s'),
'create_date' => date( 'Y-m-d H:i:s'),
];
$log_id = self::log( $log_data);
}
// 发送请求
$result = self::curl_https( $name, $method, $data, $needToken, $globalToken, $returnStream, $headers);
// 处理响应结果
if( $result['code'] == '200')
{
// 成功
$log = [ 'success' => 1];
}
else
{
// 失败
$log = [ 'success' => 0];
}
return [
// 响应数据
'response' => $result,
// 日志ID
'log_id' => $log_id,
// 需要修改的日志数据
'log_data' => $log
];
}
/**
* curl请求
* @param $name string 接口名称
* @param $method string 请求方法
* @param $data string|array 请求数据
* @param int $needToken false:平台 true:用户
* @param bool $globalToken 是否生成全局Token
* @param bool $returnStream 是否生成流文件
* @param int $headers header头格式
* @return array
* @throws Exception
*/
private static function curl_https( $name, $method, $data, $needToken = 1, $globalToken = true, $returnStream = false, $headers = 0)
{
$curl = curl_init();
$url = config( 'logg.' . $name);
if( $headers)
{
$header[0] = 'multipart/form-data;charset:UTF-8';
}
else
{
$header[0] = 'Content-type:application/json;charset:UTF-8';
}
if ($needToken == 1) {
if (self::$token_valid <= time())
{
self::getToken();
}
$header[1] = "token:" . self::$token;
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
switch ($method) {
case 'GET':
curl_setopt($curl, CURLOPT_HTTPGET, true);
break;
case 'POST':
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case 'PUT':
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case 'PATCH':
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case 'DELETE':
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
}
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Errno' . curl_error($curl);
}
if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == '200')
{
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
$filename = urlencode('pdf文档') . '.pdf';
if ( $returnStream) {
header('Content-Type: application/pdf');
header("Content-disposition: attachment; filename=$filename");
echo $body;exit;
}
}
else
{
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$body = substr($response, $headerSize);
$body = json_decode($body, true);
throw new logException( [ 'msg' => $body['message'], 'errorCode' => $body['status']]);
}
$bodyObj = json_decode($body, true);
curl_close($curl);
if ($bodyObj['code'] == 200) {
$arr = [];
if (preg_match('/token:(.*)/', $header, $arr)) {
if ($globalToken) {
self::$token = trim($arr[1]);
self::$token_valid = time() + 15 * 60;
} else {
$bodyObj['signerToken'] = trim($arr[1]);
}
}
}
return $bodyObj;
}
/**
* 写入日志
* @param array $data 数据
* @param int $id 日志表主键
* @return int|string
* @throws \think\db\exception\DbException
*/
private static function log( $data, $id = 0)
{
if( !$id)
{
$result = Db::name( 'log')->insertGetId( $data);
}
else
{
$result = Db::name( 'log')->where( 'id', $id)->update( $data);
}
return $result;
}
调用
$result = self::handle( 'create_person', 'POST', ([
'userName' => $username,
]));
self::handle( '', '', $result['response'], $result['log_data'], $result['log_id'], 0);
return $result['response'];
CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`action` varchar(100) DEFAULT '' COMMENT '动作类型',
`action_turn` varchar(100) DEFAULT '' COMMENT '转换后的动作类型',
`ip` varchar(20) DEFAULT '' COMMENT '请求IP',
`success` tinyint(1) NOT NULL DEFAULT '0' COMMENT '响应成功/失败 [0:失败,1:成功]',
`status` tinyint(1) DEFAULT '1' COMMENT '状态[1 发送中, 2 已发送]',
`request` longtext COMMENT '请求的内容',
`response` longtext COMMENT '响应的内容',
`req_date` timestamp NULL DEFAULT NULL COMMENT '请求时间',
`res_date` timestamp NULL DEFAULT NULL COMMENT '响应时间',
`create_date` timestamp NULL DEFAULT NULL COMMENT '添加时间',
`delete_time` int(11) DEFAULT '0' COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `success` (`success`) USING BTREE,
KEY `status` (`status`) USING BTREE,
KEY `req_time` (`req_date`) USING BTREE,
KEY `res_time` (`res_date`) USING BTREE,
KEY `action` (`action`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='日志表';