php基于curl扩展制作跨平台的restfule 接口

restfule 接口
适用的平台:跨平台
所依赖:curl扩展
git:https://git.oschina.net/anziguoer/restAPI

ApiServer.php

  <?php  /**   * @Author: yangyulong   * @Email : anziguoer@sina.com   * @Date:  2015-04-30 05:38:34   * @Last Modified by:  yangyulong   * @Last Modified time: 2015-04-30 17:14:11   */     class apiServer  {    /**     * 客户端请求的方式     * @var string     */    private $method = '';       /**     * 客户端发送的数据     * @var [type]     */    protected $param;       /**     * 要操作的资源     * @var [type]     */    protected $resourse;       /**     * 要操作的资源id     * @var [type]     */    protected $resourseId;          /**     * 构造函数, 获取client 请求的方式,以及传输的数据     * @param object 可以自定义传入的对象     */    public function __construct()    {      //首先对客户端的请求进行验证      $this->authorization();         $this->method = strtolower($_SERVER['REQUEST_METHOD']);         //所有的请求都是pathinfo模式      $pathinfo = $_SERVER['PATH_INFO'];         //将pathinfo数据信息映射为实际请求方法      $this->getResourse($pathinfo);         //获取传输的具体参数      $this->getData();         //执行响应      $this->doResponse();    }       /**     * 根据不同的请求方式,获取数据     * @return [type]     */    private function doResponse(){      switch ($this->method) {        case 'get':          $this->_get();          break;        case 'post':          $this->_post();          break;        case 'delete':          $this->_delete();          break;        case 'put':          $this->_put();          break;        default:          $this->_get();          break;      }    }       // 将pathinfo数据信息映射为实际请求方法    private function getResourse($pathinfo){         /**       * 将pathinfo数据信息映射为实际请求方法       * GET /users: 逐页列出所有用户;       * POST /users: 创建一个新用户;       * GET /users/123: 返回用户为123的详细信息;       * PUT /users/123: 更新用户123;       * DELETE /users/123: 删除用户123;       *       * 根据以上规则,将pathinfo第一个参数映射为需要操作的数据表,       * 第二个参数映射为操作的id       */             $info = explode('/', ltrim($pathinfo, '/'));      list($this->resourse, $this->resourseId) = $info;    }       /**     * 验证请求     */    private function authorization(){      $token = $_SERVER['HTTP_CLIENT_TOKEN'];      $authorization = md5(substr(md5($token), 8, 24).$token);      if($authorization != $_SERVER['HTTP_CLIENT_CODE']){        //验证失败,输出错误信息给客户端        $this->outPut($status = 1);      }    }       /**     * [getData 获取传送的参数信息]     * @param [type] $pad [description]     * @return [type]   [description]     */    private function getData(){      //所有的参数都是get传参      $this->param = $_GET;    }       /**     * 获取资源操作     * @return [type] [description]     */    protected function _get(){      //逻辑代码根据自己实际项目需要实现    }         /**     * 新增资源操作     * @return [type] [description]     */    protected function _post(){      //逻辑代码根据自己实际项目需要实现    }       /**     * 删除资源操作     * @return [type] [description]     */    protected function _delete(){      //逻辑代码根据自己实际项目需要实现    }       /**     * 更新资源操作     * @return [type] [description]     */    protected function _put(){      //逻辑代码根据自己实际项目需要实现    }       /**     * 出入服务端返回的数据信息 json格式     */    public function outPut($stat, $data=array()){      $status = array(        //0 状态表示请求成功        0 => array(          'code' => 1,          'info' => '请求成功',          'data' =>$data        ),        //验证失败        1 => array(          'code' => 0,          'info' => '请求不合法'        )      );         try{        if(!in_array($stat, array_keys($status))){          throw new Exception('输入的状态码不合法');        }else{          echo json_encode($status[$stat]);        }      }catch (Exception $e){        die($e->getMessage());      }    }  }

ApiClient.php

  <?php     /**   * Created by PhpStorm.   * User: anziguoer@sina.com   * Date: 2015/4/29   * Time: 12:36   * link: http://www.ruanyifeng.com/blog/2014/05/restful_api.html [restful设计指南]   */  /*** * * * * * * * * * * * * * * * * * * * * * * * * * ***    * 定义路由的请求方式                  *   *                            *   * $url_model=0                     *   * 采用传统的URL参数模式                 *   * http://serverName/appName/?m=module&a=action&id=1   *   * * * * * * * * * * * * * * * * * * * * * * * * * * * * *   * PATHINFO模式(默认模式)               *   * 设置url_model 为1                   *   * http://serverName/appName/module/action/id/1/     *   ** * * * * * * * * * * * * * * * * * * * * * * * * * * **  */  class restClient  {    //请求的token    const token='yangyulong';       //请求url    private $url;         //请求的类型    private $requestType;         //请求的数据    private $data;         //curl实例    private $curl;       public $status;       private $headers = array();    /**     * [__construct 构造方法, 初始化数据]     * @param [type] $url     请求的服务器地址     * @param [type] $requestType 发送请求的方法     * @param [type] $data    发送的数据     * @param integer $url_model  路由请求方式     */    public function __construct($url, $data = array(), $requestType = 'get') {             //url是必须要传的,并且是符合PATHINFO模式的路径      if (!$url) {        return false;      }      $this->requestType = strtolower($requestType);      $paramUrl = '';      // PATHINFO模式      if (!empty($data)) {        foreach ($data as $key => $value) {          $paramUrl.= $key . '=' . $value.'&';        }        $url = $url .'?'. $paramUrl;      }             //初始化类中的数据      $this->url = $url;             $this->data = $data;      try{        if(!$this->curl = curl_init()){          throw new Exception('curl初始化错误:');        };      }catch (Exception $e){        echo '<pre>';        print_r($e->getMessage());        echo '</pre>';      }         curl_setopt($this->curl, CURLOPT_URL, $this->url);      curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);       }         /**     * [_post 设置get请求的参数]     * @return [type] [description]     */    public function _get() {       }         /**     * [_post 设置post请求的参数]     * post 新增资源     * @return [type] [description]     */    public function _post() {         curl_setopt($this->curl, CURLOPT_POST, 1);         curl_setopt($this->curl, CURLOPT_POSTFIELDS, $this->data);           }         /**     * [_put 设置put请求]     * put 更新资源     * @return [type] [description]     */    public function _put() {             curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, 'PUT');    }         /**     * [_delete 删除资源]     * delete 删除资源     * @return [type] [description]     */    public function _delete() {      curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, 'DELETE');       }         /**     * [doRequest 执行发送请求]     * @return [type] [description]     */    public function doRequest() {      //发送给服务端验证信息      if((null !== self::token) && self::token){        $this->headers = array(          'Client_Token: '.self::token,          'Client_Code: '.$this->setAuthorization()        );      }         //发送头部信息      $this->setHeader();         //发送请求方式      switch ($this->requestType) {        case 'post':          $this->_post();          break;           case 'put':          $this->_put();          break;           case 'delete':          $this->_delete();          break;           default:          curl_setopt($this->curl, CURLOPT_HTTPGET, TRUE);          break;      }      //执行curl请求      $info = curl_exec($this->curl);         //获取curl执行状态信息      $this->status = $this->getInfo();      return $info;    }       /**     * 设置发送的头部信息     */    private function setHeader(){      curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->headers);    }       /**     * 生成授权码     * @return string 授权码     */    private function setAuthorization(){      $authorization = md5(substr(md5(self::token), 8, 24).self::token);      return $authorization;    }    /**     * 获取curl中的状态信息     */    public function getInfo(){      return curl_getinfo($this->curl);    }       /**     * 关闭curl连接     */    public function __destruct(){      curl_close($this->curl);    }  }

testClient.php

  <?php  /**   * Created by PhpStorm.   * User: anziguoer@sina.com   * Date: 2015/4/29   * Time: 12:35   */     include './ApiClient.php';     $arr = array(    'user' => 'anziguoer',    'passwd' => 'yangyulong'  );  // $url = 'http://localhost/restAPI/restServer.php';  $url = 'http://localhost/restAPI/testServer.php/user/123';     $rest = new restClient($url, $arr, 'get');  $info = $rest->doRequest();     //获取curl中的状态信息  $status = $rest->status;  echo '<pre>';  print_r($info);  echo '</pre>';

testServer.php

  <?php  /**   * @Author: anziguoer@sina.com   * @Email: anziguoer@sina.com   * @link: https://git.oschina.net/anziguoer   * @Date:  2015-04-30 16:52:53   * @Last Modified by:  yangyulong   * @Last Modified time: 2015-04-30 17:26:37   */     include './ApiServer.php';     class testServer extends apiServer  {    /**     * 先执行apiServer中的方法,初始化数据     * @param object $obj 可以传入的全局对象[数据库对象,框架全局对象等]     */         private $obj;       function __construct()//object $obj    {      parent::__construct();      //$this->obj = $obj;      //$this->resourse; 父类中已经实现,此类中可以直接使用      //$tihs->resourseId; 父类中已经实现,此类中可以直接使用    }         /**     * 获取资源操作     * @return [type] [description]     */    protected function _get(){      echo "get";      //逻辑代码根据自己实际项目需要实现    }         /**     * 新增资源操作     * @return [type] [description]     */    protected function _post(){      echo "post";      //逻辑代码根据自己实际项目需要实现    }       /**     * 删除资源操作     * @return [type] [description]     */    protected function _delete(){      //逻辑代码根据自己实际项目需要实现    }       /**     * 更新资源操作     * @return [type] [description]     */    protected function _put(){      echo "put";      //逻辑代码根据自己实际项目需要实现    }  }     $server = new testServer();

以上所述就是本文的全部内容了,希望大家能够喜欢。

php基于curl扩展制作跨平台的restfule 接口

郑重声明:本网站发布的内容(图片、视频和文字)以及用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服

发表评论

登录后才能评论