當PHP作為客戶端去對接resuful api的時候尔破,手動封裝一個專門請求api的類级历,代碼如下
<?php
namespace app\api\service;
/**
* CURL數(shù)據(jù)請求管理器
* Class Http
*/
class HttpService
{
//注意如果請求內容為json梨州,則要把post請求中的form-data 進行json_encode已經修改對應的header
public static $headers = ['Content-Type:application/x-www-form-urlencoded;charset=UTF-8;'];
/**
* 設置頭信息
* @param array $headers 頭信息
*/
public static function setHeader($headers){
self::$headers = array_merge(self::$headers,$headers);
}
/**
* 以get模擬網絡請求
* @param string $url HTTP請求URL地址
* @param array $query GET請求參數(shù)
* @param array $options CURL參數(shù)
* @return boolean|string
*/
public static function get($url, $query = [], $options = []){
$options['query'] = $query;
return self::request('get', $url, $options);
}
/**
* 以POST模擬網絡請求
* @param string $url HTTP請求URL地址
* @param array $data POST請求數(shù)據(jù)
* @param array $options CURL參數(shù)
* @return boolean|string
*/
public static function post($url, $data = [], $options = []){
$options['data'] = $data;
return self::request('post', $url, $options);
}
/**
* 以DELETE模擬網絡請求
* @param string $url HTTP請求URL地址
* @param array $data DELETE請求數(shù)據(jù)
* @param array $options CURL參數(shù)
* @return boolean|string
*/
public static function delete($url,$query = [],$options = []){
$options['query'] = $query;
return self::request('delete', $url, $options);
}
/**
* 以PUT模擬網絡請求
* @param string $url HTTP請求URL地址
* @param array $data DELETE請求數(shù)據(jù)
* @param array $options CURL參數(shù)
* @return boolean|string
*/
public static function put($url,$data = [],$options = []){
$options['data'] = $data;
return self::request('put', $url, $options);
}
/**
* CURL模擬網絡請求
* @param string $method 請求方法
* @param string $url 請求方法
* @param array $options 請求參數(shù)[headers,data]
* @return boolean|string
*/
public static function request($method, $url, $options = []){
$curl = curl_init();
// GET 參數(shù)設置
if (!empty($options['query'])) {
$url .= (stripos($url, '?') !== false ? '&' : '?') . http_build_query($options['query']);
}
// 瀏覽器代理設置
curl_setopt($curl, CURLOPT_USERAGENT, self::getUserAgent());
// CURL 頭信息設置
if (!empty($options['headers'])) {
self::$headers = array_merge(self::$headers,$options['headers']);
}
curl_setopt($curl, CURLOPT_HTTPHEADER, self::$headers);
// Cookie 信息設置
if (!empty($options['cookie'])) {
curl_setopt($curl, CURLOPT_COOKIE, $options['cookie']);
}
if (!empty($options['cookie_file'])) {
curl_setopt($curl, CURLOPT_COOKIEJAR, $options['cookie_file']);
curl_setopt($curl, CURLOPT_COOKIEFILE, $options['cookie_file']);
}
// POST 數(shù)據(jù)設置
if (strtolower($method) === 'post') {
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, self::buildQueryData($options['data']));
}
//PUT 數(shù)據(jù)設置
if (strtolower($method) === 'put') {
curl_setopt($curl, CURLOPT_POSTFIELDS,self::buildQueryData($options['data']));
}
// 請求超時設置
if (isset($options['timeout']) && is_numeric($options['timeout'])) {
curl_setopt($curl, CURLOPT_TIMEOUT, $options['timeout']);
} else {
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl,CURLINFO_HEADER_OUT,true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, strtoupper($method));
$content = json_decode(curl_exec($curl),true);
$content['status'] = curl_getinfo ( $curl, CURLINFO_HTTP_CODE );
if($content['code'] != 200) {
//在這里處理異常信息
}
curl_close($curl);
return $content;
}
/**
* POST數(shù)據(jù)過濾處理
* @param array $data 需要處理的數(shù)據(jù)
* @param boolean $build 是否編譯數(shù)據(jù)
* @return array|string
*/
private static function buildQueryData($data, $build = true)
{
if (!is_array($data)) return $data;
foreach ($data as $key => $value) if (is_object($value) && $value instanceof \CURLFile) {
$build = false;
} elseif (is_string($value) && class_exists('CURLFile', false) && stripos($value, '@') === 0) {
if (($filename = realpath(trim($value, '@'))) && file_exists($filename)) {
list($build, $data[$key]) = [false, new \CURLFile($filename)];
}
}
return $build ? http_build_query($data) : $data;
}
/**
* 獲取瀏覽器代理信息
* @return string
*/
private static function getUserAgent(){
if (!empty($_SERVER['HTTP_USER_AGENT'])) return $_SERVER['HTTP_USER_AGENT'];
$userAgents = [
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
];
return $userAgents[array_rand($userAgents, 1)];
}
}
調用(本文對接環(huán)信為例) base
<?php
namespace app\api\service\sdk\huanxin;
use app\api\service\HttpService;
/**
* @author jinanav
* @desc 環(huán)信基礎務器類
*/
class BaseService {
//配置參數(shù)
protected $config = [];
//令牌
protected $token = '';
/**
* BaseService constructor.初始化
*/
public function __construct(array $config = []){
$this->config = config('huanxin.');
!empty($config) && $this->config = array_merge($this->config,$config);
empty($this->config) && ajaxReturn(500,'配置參數(shù)異常');
$this->token = $this->getToken();
HttpService::setHeader(['Authorization:Bearer '.$this->token]);
}
/**
* 獲取管理員權限
* @author jinanav
* @return array | string
*/
public function getToken(){
//獲取環(huán)信token
$token = cache('huanxin_token');
if(!empty($token) && time() < $token['expires_in']) return $token['access_token'];
//如果已過期
$token = HttpService::post($this->config['url_fix'].'token', [
'grant_type' => 'client_credentials',
'client_id' => $this->config['client_id'],
'client_secret' => $this->config['client_secret']
]);
//緩存token
$token['expires_in'] = time() + intval($token['expires_in']) - 600;
cache('huanxin_token',$token);
return $token['access_token'];
}
}
調用用戶類
<?php
namespace app\api\service\sdk\huanxin\user;
use app\api\service\HttpService;
use app\api\service\sdk\huanxin\BaseService;
/**
* @author jinanav
* @desc 環(huán)信用戶管理服務類
*/
class UserService extends BaseService {
/**
* 注冊單個用戶
* @author jinanav
* @return mixed
*/
public function registerUser($username,$password,$nickname){
$url = $this->config['url_fix'].'users';
$param = [
'username' => $username,
'password' => $password,
'nickname' => $nickname
];
return HttpService::post($url,$param);
}
/**
* 批量注冊用戶
* @author jinanav
* @param array $regArray 批量用戶列表
* @return mixed
*/
public function registerMoreUser(array $regArray){
$url = $this->config['url_fix'].'users';
return HttpService::post($url,$regArray);
}
/**
* 獲取單個用戶
* @author jinanav
* @param string $username 用戶名 (實際上是手機號)
* @return mixed
*/
public function getUser(string $username){
$url = $this->config['url_fix'].'users/'.$username;
return HttpService::get($url);
}
/**
* 獲取批量用戶
* @author jinanav
* @return mixed
*/
public function getMoreUser($limit = 15,$cursor = ''){
$url = $this->config['url_fix'].'users';
$param = empty($cursor) ? ['limit' => $limit,'cursor' => $limit] : [];
return HttpService::get($url,$param);
}
/**
* 刪除單個用戶
* @author jinanav
* @return mixed
*/
public function delUser($username){
$url = $this->config['url_fix'].'users/'.$username;
return HttpService::delete($url);
}
/**
* 刪除多個用戶
* @author jinanav
* @param int $limit 用戶數(shù)目
* @return mixed
*/
public function delMoreUser($limit = 0){
$url = $this->config['url_fix'].'users/';
return HttpService::delete($url,['limit' => $limit]);
}
/**
* 更改密碼
* @author jinanav
* @param string $username 用戶名
* @param string $password 密碼
* @return mixed
*/
public function changePassword($username,$password){
$url = $this->config['url_fix'].'users/'.$username.'/password';
return HttpService::put($url,['newpassword'=>$password]);
}
/**
* 設置推送昵稱
* @author jinanav
* @param string $nickname 推送昵稱
* @return mixed
*/
public function setNickname($nickname){
$url = $this->config['url_fix'].'users/nickname';
return HttpService::put($url,['nickname'=>$nickname]);
}
/**
* 設置推送消息展示方式
* @author jinanav
* @param int $notification_display_style 展示方式 “0”僅通知,“1“通知以及消息詳情
* @return mixed
*/
public function notification($username,$notification_display_style){
$url = $this->config['url_fix'].'users/'.$username;
return HttpService::put($url,['notification_display_style'=>$notification_display_style]);
}
/**
* 設置免打擾
* @author jinanav
* @param string $username 用戶名
* @param int $disturbing 是否免打擾究反,“0”代表免打擾關閉,“1”免打擾開啟
* @param int $start 免打擾起始時間邑时,單位是小時
* @param int $end 免打擾結束時間奴紧,單位是小時
* @return mixed
*/
public function disturbing($username,$disturbing,$start,$end){
$url = $this->config['url_fix'].'users/'.$username;
return HttpService::put($url,[
'notification_no_disturbing' => $disturbing,
'notification_no_disturbing_start' => $start,
'notification_no_disturbing_end' => $end,
]);
}
/**
* 用戶賬號禁用
* @author jinanav
* @param string $username 用戶名
* @return mixed
*/
public function deactivate($username){
$url = $this->config['url_fix'].'users/'.$username.'/deactivate';
return HttpService::post($url);
}
/**
* 用戶賬號解禁
* @author jinanav
* @param string $username 用戶名
* @return mixed
*/
public function activate($username){
$url = $this->config['url_fix'].'users/'.$username.'/activate';
return HttpService::post($url);
}
/**
* 強制下線
* @author jinanav
* @param string $username 用戶名
* @return mixed
*/
public function disconnect($username){
$url = $this->config['url_fix'].'users/'.$username.'/disconnect';
return HttpService::post($url);
}
}