废话不多说了,直接上代码具体看代码的注释吧:
方法一,
/** * 发送请求的方法 * @param $type 请求类型get或post * @param string $url 发送请求的URL * @param $data post请求数据 * @param bool $ssl 是否为https协议 * @return string 响应主体Conent */ public function http_request($type='post',$url, $data=array(), $ssl=true) { // 首先需要开启curl扩展 $curl = curl_init();// curl初始化 // 设置curl传输选项 curl_setopt($curl, CURLOPT_URL, $url);// $curl句柄, CURLOPT_URL需要获取的URL地址,也可以在 curl_init() 函数中设置。 // user_agent 设置请求代理信息 $agent = $_SERVER['HTTP_USER_AGENT']; $user_agent = isset($agent) ? $agent : 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'; curl_setopt($curl, CURLOPT_USERAGENT, $user_agent); //CURL_USERAGENT 在HTTP请求中包含一个"User-Agent: "头的字符串 // referer头 请求来源 curl_setopt($curl, CURLOPT_AUTOREFERER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时时间 // SSL相关的选项设置 if($ssl) { curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // CURLOPT_SSL_VERIFYPEER 禁用后cURL将终止从服务端进行验证 //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 默认为2,因此可以省略不写 } if($type == "post") { // 处理POST相关选项(比get多下面两项设置,其他都是一样的) curl_setopt($curl, CURLOPT_POST, true); // 是否为post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // 发送post数据 } // 响应信息设置(这里只需要获取相应主体,其他如响应头不需要去处理) curl_setopt($curl, CURLOPT_HEADER, false); // 是否处理响应头 //设置curl参数,要求结果是否输出到屏幕上,为true的时候是不返回到网页中 curl_setopt($curl, CURLOPT_RETURNTRANSFER , true); // curl_exec() 是否返回响应结果 // 发出请求 $response = curl_exec($curl); $error = curl_error($curl); curl_close($curl); // 关闭资源 //发生错误,抛出异常 if($error) throw new \Exception('请求发生错误:' . $error); return $response; }
方法二,php curl就是php中的数据传输神器。( 接口开发的必备技能之一)
//curl获取数据 public function curl_get_post($url, $data = '', $request = 'GET') { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_AUTOREFERER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_TIMEOUT, 30); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);//这里设置后,发送的数据就是json $data = curl_exec($curl); if(curl_errno($curl)) { //echo 'Errno' . curl_error($curl); error_log(date("Y-m-d H:i:s", time()) . ":Errno" . curl_error($curl) . "t\r\n", 3, "data/component_access_token/log.txt"); } curl_close($curl); return $data; }
方法三,由于接口开发,每次调用接口都需要一个令牌环凭据 accesstoken,而且每次授权后,它都有一个过期的期限 。
我的做法是将token直接保存在文本文件中(.txt),然后根据过期的时间去判断是否再次获取。
注意*:今天在使用file_put_contents的时候,犯了一个错误,就是以为这个函数会穿件文件夹,如果父级目录文件夹不存在的话,这个函数是无法自动创建文件的
if(!empty($auth_code)) { $result = $this->http_request('post', $url, $data=array(), true); $result = json_decode($result, true); $access_token=$result['access_token']; $refresh_token=$result['refresh_token']; file_put_contents("data/weimob_access_token/" . $client_id . ".txt", $access_token . ',' . $refresh_token . ',' . time()); }else{ if(!file_exists("data/weimob_access_token/" . $client_id . '.txt')) { return false; } $str = file_get_contents("data/weimob_access_token/" . $client_id . '.txt'); $arr = explode(',', $str); $access_token = $arr[0]; $refresh_token = $arr[1]; $time = $arr[2]; if($time + $this->expires_in < time()) { $result = $this->http_request('post', $url, $data=array(), true); $result = json_decode($result, true); $access_token=$result['access_token']; $refresh_token=$result['refresh_token']; file_put_contents("data/weimob_access_token/" . $client_id . ".txt", $access_token . ',' . $refresh_token . ',' . time()); } } return $access_token;