接口开发封装的几个常用的方法

废话不多说了,直接上代码具体看代码的注释吧:

方法一,

/**
     * 发送请求的方法
     * @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;
时间: 2024-08-01 20:21:29

接口开发封装的几个常用的方法的相关文章

移动互联网(一)短信和彩信等接口开发封装

在这个项目中涉及到了短信和彩信等功能,这个算是一个项目重要组成部分,曾经想过这个功能怎么开发,例如在我们永和系统中有很多订单,可以给用户办理会员卡等业务如何让用户及时知道自己卡里的消费情况?如何让用户心中存在安全感,试想想在你的银行卡每次消费或者转入.转出每一笔款的时候都有短信提示,你是不是无意中增加了一份安全感呢? 大家在想想目前的各类门户网站,以及我们常用的CSDN等论坛都提供有短信登录.以及短信验证码.短信注册等等同短信沾边的业务内容,所有的这些都是一个思想提高系统灵活性.易用性.安全性,

微信公众平台消息接口开发-封装weixin.class.php(转)

一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处理. 我们就考虑在这个基础上做一次封装,weixin.class.php,代码如下: <?php class Weixin {     public $token = '';//token     public $debug =  false;//是否debug的状态标示,方便我们在调试的时候记录一些中间数据     public $setFlag = false;

微信公众平台消息接口开发-封装weixin.class.php

原文:微信公众平台消息接口开发-封装weixin.class.php 一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处理. 我们就考虑在这个基础上做一次封装,weixin.class.php,代码如下: <?php class Weixin {     public $token = '';//token     public $debug =  false;//是否debug的状态标示,方便我们在调试的时候记录一

odoo Controller接口开发 POST请求的跨域问题解决方法

odoo Controller接口开发 POST请求的跨域问题解决方法 1.odoo Controller接口开发,前端在请求的时候会发生跨域问题,报错信息如下:Function declared as capable of handling request of type 'json' but called with a request of type 'http' 2.解决方法如下: odoo官网给的参数解释: cors – The Access-Control-Allow-Origin c

【iOS开发-网络】两种常用的方法解析XML数据

解析XML数据常用的有两种方法 第一种 使用Google的GDataXMLNode解析XML数据 使用的是DOM方式解析 先把xml一口吞掉 然后一点一点的解析 第二种 使用苹果自带的NSXMLParser解析XML数据 使用的是SAX方式解析 一个标记一个标记的解析 第一种使用步骤 第一步 首先把GDataXML文件夹放入项目中 第二步 更改Bulid Setting里面的东西 更改头文件搜索路径 在Header Search Paths里面添加路径/usr/include/libxml2 在

C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试

在上篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用.微信小店的相关对象模型,基本上包括了常规的商品.商品分组.货架.库存.订单这些模型,还有商品分类,商品分类属性.商品分类SKU.快递邮寄模板.图片管理等功能.本文介绍的接口封装也就是基于这些内容进行的,并针对接口的实现进行测试和使用. 1.商品管理接口的定义 前面文章介绍了微信小店的对象模型,如下所示. 这个图形基本上覆

【微信公众平台开发】百度周边搜索接口php封装

现在微信公众平台很多娱乐的,都有用到周边搜索功能,研究下比较简单,通过百度周边搜索接口封装如下: 调用格式: $wechatBaiduAPI = new WechatBaiduAPI(); $ret = $wechatBaiduAPI->Place_search($str_key,$location['x'].",".$location['y'] ); 参数说明: $query:搜素关键词 $location: 地理位置经纬度 $radius: 搜索半径 <?php cla

Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用

一.Android平台编程方式:      1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现)      2.自从ndk r5发布以后,已经允许完全用C/C++ 来开发应用或者游戏,而不再需要编写任何Java 的代码   Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序. 二.跨平台移动开发   Delphi使用android的NDK是通过JNI接口,封装好了,不用自己

【C/C++学院】0828-数组与指针/内存分配/数据结构数组接口与封装

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. 数组与指针 #include<stdio.h> #include<stdlib.h> void main1() { int a[10]