/** * 获取CURL对象,实现单例 * @return object \mysoft\http\Curl */ private function _getCurl() { static $curl; //单例对象 if ($curl) { return $curl; } $curl = new Curl(); $curl->setOption(CURLOPT_HEADER, true); //开启捕获header信息 $curl->setOption(CURLOPT_VERBOSE, false); return $curl; }
/** * 请求Api * @param strign $http_method , post or get * @param string $url , '/orgcode/demo/site/index' * @param array $params ,['id'=>1,'type'=>'test' ,...] ,也可以不传,如果参数在url参数上,这里必须传空 * @param array|string $data post提交数据的时候必须传 * @return string * @throws \Exception */ private function _callApi($http_method, $url, $params = [], $data = []) { // $cache_result = $this->_getFromCache($url,$params); // if($cache_result){ // return $cache_result; // } $curl = new Curl(); if ($this->curl_options) { //设置超时请求 foreach ($this->curl_options as $key => $val) { $curl->setOption($key, $val); //设置curl options } } //将签名参数加入到GET请求里,最终生成一个参数值,从而简化了请求 $params[$this->sign_key] = $this->_getSign($this->appid, $this->appsecret, time()); switch (strtoupper($http_method)) { case 'GET': $result = $curl->get($url, $params, $this->debug); break; case 'POST': $result = $curl->post($url, $data, $params, $this->debug); break; default: throw new \Exception('不支持的HTTP请求方法'); } if ($curl->getError()) { return \mysoft\helpers\String::jsonEncode(['success' => 0, 'data' => $curl->getError()]); } return $result; }
/** * 发送post请求 * @param type $apiPath * @param type $data * @param array $params * @param type $context 请求上下文,比如带状态的请求的taskId,格式['taskId'=>'','logId'=>''] * @return type */ public function post($apiPath, $data, $params = array(), $context = []) { $signature = $this->_getSign($this->_appid, $this->_appsecret, time()); $params[$this->sign_key] = $signature; $params['appid'] = $this->_appid; $curl = new Curl(); if (!isset($this->timeout)) { $this->timeout = 120; } $curl->setOption(CURLOPT_TIMEOUT, $this->timeout); $curl->setOption(CURLOPT_SSL_VERIFYPEER, FALSE); $curl->setOption(CURLOPT_SSL_VERIFYHOST, FALSE); $url = $this->_buildUrl($apiPath); $postData = ['url' => $url, 'data' => $data, 'params' => $params]; $startTime = microtime(true); $context['bgnTime'] = date('Y-m-d H:i:s'); $receiveData = $curl->post($url, \mysoft\helpers\String::jsonEncode($data), $params); $context['endTime'] = date('Y-m-d H:i:s'); $context['requestTime'] = (microtime(true) - $startTime) * 1000; return $this->_handleReceiveData($curl, $postData, $receiveData, $context); }