首页 > 开发 > PHP > 正文

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

2024-05-04 23:35:02
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php基于curl扩展制作跨平台的restfule 接口的相关资料以及详细的代码,有需要的小伙伴可以参考下。

restfule 接口

适用的平台:跨平台

所依赖:curl扩展

git:https://git.oschina.net/anziguoer/restAPI

ApiServer.php

 

 
  1. <?php 
  2. /** 
  3. * @Author: yangyulong 
  4. * @Email : anziguoer@sina.com 
  5. * @Date: 2015-04-30 05:38:34 
  6. * @Last Modified by: yangyulong 
  7. * @Last Modified time: 2015-04-30 17:14:11 
  8. */ 
  9.  
  10. class apiServer 
  11. /** 
  12. * 客户端请求的方式 
  13. * @var string 
  14. */ 
  15. private $method = ''
  16.  
  17. /** 
  18. * 客户端发送的数据 
  19. * @var [type] 
  20. */ 
  21. protected $param
  22.  
  23. /** 
  24. * 要操作的资源 
  25. * @var [type] 
  26. */ 
  27. protected $resourse
  28.  
  29. /** 
  30. * 要操作的资源id 
  31. * @var [type] 
  32. */ 
  33. protected $resourseId
  34.  
  35.  
  36. /** 
  37. * 构造函数, 获取client 请求的方式,以及传输的数据 
  38. * @param object 可以自定义传入的对象 
  39. */ 
  40. public function __construct() 
  41. //首先对客户端的请求进行验证 
  42. $this->authorization(); 
  43.  
  44. $this->method = strtolower($_SERVER['REQUEST_METHOD']); 
  45.  
  46. //所有的请求都是pathinfo模式 
  47. $pathinfo = $_SERVER['PATH_INFO']; 
  48.  
  49. //将pathinfo数据信息映射为实际请求方法 
  50. $this->getResourse($pathinfo); 
  51.  
  52. //获取传输的具体参数 
  53. $this->getData(); 
  54.  
  55. //执行响应 
  56. $this->doResponse(); 
  57.  
  58. /** 
  59. * 根据不同的请求方式,获取数据 
  60. * @return [type] 
  61. */ 
  62. private function doResponse(){ 
  63. switch ($this->method) { 
  64. case 'get'
  65. $this->_get(); 
  66. break
  67. case 'post'
  68. $this->_post(); 
  69. break
  70. case 'delete'
  71. $this->_delete(); 
  72. break
  73. case 'put'
  74. $this->_put(); 
  75. break
  76. default
  77. $this->_get(); 
  78. break
  79.  
  80. // 将pathinfo数据信息映射为实际请求方法 
  81. private function getResourse($pathinfo){ 
  82.  
  83. /** 
  84. * 将pathinfo数据信息映射为实际请求方法 
  85. * GET /users: 逐页列出所有用户; 
  86. * POST /users: 创建一个新用户; 
  87. * GET /users/123: 返回用户为123的详细信息; 
  88. * PUT /users/123: 更新用户123; 
  89. * DELETE /users/123: 删除用户123; 
  90. * 
  91. * 根据以上规则,将pathinfo第一个参数映射为需要操作的数据表, 
  92. * 第二个参数映射为操作的id 
  93. */ 
  94.  
  95. $info = explode('/', ltrim($pathinfo'/')); 
  96. list($this->resourse, $this->resourseId) = $info
  97.  
  98. /** 
  99. * 验证请求 
  100. */ 
  101. private function authorization(){ 
  102. $token = $_SERVER['HTTP_CLIENT_TOKEN']; 
  103. $authorization = md5(substr(md5($token), 8, 24).$token); 
  104. if($authorization != $_SERVER['HTTP_CLIENT_CODE']){ 
  105. //验证失败,输出错误信息给客户端 
  106. $this->outPut($status = 1); 
  107.  
  108. /** 
  109. * [getData 获取传送的参数信息] 
  110. * @param [type] $pad [description] 
  111. * @return [type] [description] 
  112. */ 
  113. private function getData(){ 
  114. //所有的参数都是get传参 
  115. $this->param = $_GET
  116.  
  117. /** 
  118. * 获取资源操作 
  119. * @return [type] [description] 
  120. */ 
  121. protected function _get(){ 
  122. //逻辑代码根据自己实际项目需要实现 
  123. }  
  124.  
  125. /** 
  126. * 新增资源操作 
  127. * @return [type] [description] 
  128. */ 
  129. protected function _post(){ 
  130. //逻辑代码根据自己实际项目需要实现 
  131.  
  132. /** 
  133. * 删除资源操作 
  134. * @return [type] [description] 
  135. */ 
  136. protected function _delete(){ 
  137. //逻辑代码根据自己实际项目需要实现 
  138.  
  139. /** 
  140. * 更新资源操作 
  141. * @return [type] [description] 
  142. */ 
  143. protected function _put(){ 
  144. //逻辑代码根据自己实际项目需要实现 
  145.  
  146. /** 
  147. * 出入服务端返回的数据信息 json格式 
  148. */ 
  149. public function outPut($stat$data=array()){ 
  150. $status = array
  151. //0 状态表示请求成功 
  152. 0 => array
  153. 'code' => 1, 
  154. 'info' => '请求成功'
  155. 'data' =>$data 
  156. ), 
  157. //验证失败 
  158. 1 => array
  159. 'code' => 0, 
  160. 'info' => '请求不合法' 
  161. ); 
  162.  
  163. try{ 
  164. if(!in_array($statarray_keys($status))){ 
  165. throw new Exception('输入的状态码不合法'); 
  166. }else
  167. echo json_encode($status[$stat]); 
  168. }catch (Exception $e){ 
  169. die($e->getMessage()); 

ApiClient.php

 

 
  1. <?php 
  2.  
  3. /** 
  4. * Created by PhpStorm. 
  5. * User: anziguoer@sina.com 
  6. * Date: 2015/4/29 
  7. * Time: 12:36 
  8. * link: http://www.ruanyifeng.com/blog/2014/05/restful_api.html [restful设计指南] 
  9. */ 
  10. /*** * * * * * * * * * * * * * * * * * * * * * * * * * ***/ 
  11. * 定义路由的请求方式 * 
  12. * * 
  13. * $url_model=0 * 
  14. * 采用传统的URL参数模式 * 
  15. * http://serverName/appName/?m=module&a=action&id=1 * 
  16. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  17. * PATHINFO模式(默认模式) * 
  18. * 设置url_model 为1 * 
  19. * http://serverName/appName/module/action/id/1/ * 
  20. ** * * * * * * * * * * * * * * * * * * * * * * * * * * ** 
  21. */ 
  22. class restClient 
  23. //请求的token 
  24. const token='yangyulong'
  25.  
  26. //请求url 
  27. private $url
  28.  
  29. //请求的类型 
  30. private $requestType
  31.  
  32. //请求的数据 
  33. private $data
  34.  
  35. //curl实例 
  36. private $curl
  37.  
  38. public $status
  39.  
  40. private $headers = array(); 
  41. /** 
  42. * [__construct 构造方法, 初始化数据] 
  43. * @param [type] $url 请求的服务器地址 
  44. * @param [type] $requestType 发送请求的方法 
  45. * @param [type] $data 发送的数据 
  46. * @param integer $url_model 路由请求方式 
  47. */ 
  48. public function __construct($url$data = array(), $requestType = 'get') { 
  49.  
  50. //url是必须要传的,并且是符合PATHINFO模式的路径 
  51. if (!$url) { 
  52. return false; 
  53. $this->requestType = strtolower($requestType); 
  54. $paramUrl = ''
  55. // PATHINFO模式 
  56. if (!emptyempty($data)) { 
  57. foreach ($data as $key => $value) { 
  58. $paramUrl.= $key . '=' . $value.'&'
  59. $url = $url .'?'$paramUrl
  60.  
  61. //初始化类中的数据 
  62. $this->url = $url
  63.  
  64. $this->data = $data
  65. try{ 
  66. if(!$this->curl = curl_init()){ 
  67. throw new Exception('curl初始化错误:'); 
  68. }; 
  69. }catch (Exception $e){ 
  70. echo '<pre>'
  71. print_r($e->getMessage()); 
  72. echo '</pre>'
  73.  
  74. curl_setopt($this->curl, CURLOPT_URL, $this->url); 
  75. curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); 
  76.  
  77.  
  78. /** 
  79. * [_post 设置get请求的参数] 
  80. * @return [type] [description] 
  81. */ 
  82. public function _get() { 
  83.  
  84.  
  85. /** 
  86. * [_post 设置post请求的参数] 
  87. * post 新增资源 
  88. * @return [type] [description] 
  89. */ 
  90. public function _post() { 
  91.  
  92. curl_setopt($this->curl, CURLOPT_POST, 1); 
  93.  
  94. curl_setopt($this->curl, CURLOPT_POSTFIELDS, $this->data); 
  95.  
  96.  
  97. /** 
  98. * [_put 设置put请求] 
  99. * put 更新资源 
  100. * @return [type] [description] 
  101. */ 
  102. public function _put() { 
  103.  
  104. curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, 'PUT'); 
  105.  
  106. /** 
  107. * [_delete 删除资源] 
  108. * delete 删除资源 
  109. * @return [type] [description] 
  110. */ 
  111. public function _delete() { 
  112. curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, 'DELETE'); 
  113.  
  114.  
  115. /** 
  116. * [doRequest 执行发送请求] 
  117. * @return [type] [description] 
  118. */ 
  119. public function doRequest() { 
  120. //发送给服务端验证信息 
  121. if((null !== self::token) && self::token){ 
  122. $this->headers = array
  123. 'Client_Token: '.self::token, 
  124. 'Client_Code: '.$this->setAuthorization() 
  125. ); 
  126.  
  127. //发送头部信息 
  128. $this->setHeader(); 
  129.  
  130. //发送请求方式 
  131. switch ($this->requestType) { 
  132. case 'post'
  133. $this->_post(); 
  134. break
  135.  
  136. case 'put'
  137. $this->_put(); 
  138. break
  139.  
  140. case 'delete'
  141. $this->_delete(); 
  142. break
  143.  
  144. default
  145. curl_setopt($this->curl, CURLOPT_HTTPGET, TRUE); 
  146. break
  147. //执行curl请求 
  148. $info = curl_exec($this->curl); 
  149.  
  150. //获取curl执行状态信息 
  151. $this->status = $this->getInfo(); 
  152. return $info
  153.  
  154. /** 
  155. * 设置发送的头部信息 
  156. */ 
  157. private function setHeader(){ 
  158. curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->headers); 
  159.  
  160. /** 
  161. * 生成授权码 
  162. * @return string 授权码 
  163. */ 
  164. private function setAuthorization(){ 
  165. $authorization = md5(substr(md5(self::token), 8, 24).self::token); 
  166. return $authorization
  167. /** 
  168. * 获取curl中的状态信息 
  169. */ 
  170. public function getInfo(){ 
  171. return curl_getinfo($this->curl); 
  172.  
  173. /** 
  174. * 关闭curl连接 
  175. */ 
  176. public function __destruct(){ 
  177. curl_close($this->curl); 

testClient.php

 

 
  1. <?php 
  2. /** 
  3. * Created by PhpStorm. 
  4. * User: anziguoer@sina.com 
  5. * Date: 2015/4/29 
  6. * Time: 12:35 
  7. */ 
  8.  
  9. include './ApiClient.php'
  10.  
  11. $arr = array
  12. 'user' => 'anziguoer'
  13. 'passwd' => 'yangyulong' 
  14. ); 
  15. // $url = 'http://localhost/restAPI/restServer.php'; 
  16. $url = 'http://localhost/restAPI/testServer.php/user/123'
  17.  
  18. $rest = new restClient($url$arr'get'); 
  19. $info = $rest->doRequest(); 
  20.  
  21. //获取curl中的状态信息 
  22. $status = $rest->status; 
  23. echo '<pre>'
  24. print_r($info); 
  25. echo '</pre>'

testServer.php

 

 
  1. <?php 
  2. /** 
  3. * @Author: anziguoer@sina.com 
  4. * @Email: anziguoer@sina.com 
  5. * @link: https://git.oschina.net/anziguoer 
  6. * @Date: 2015-04-30 16:52:53 
  7. * @Last Modified by: yangyulong 
  8. * @Last Modified time: 2015-04-30 17:26:37 
  9. */ 
  10.  
  11. include './ApiServer.php'
  12.  
  13. class testServer extends apiServer 
  14. /** 
  15. * 先执行apiServer中的方法,初始化数据 
  16. * @param object $obj 可以传入的全局对象[数据库对象,框架全局对象等] 
  17. */ 
  18.  
  19. private $obj
  20.  
  21. function __construct()//object $obj 
  22. parent::__construct(); 
  23. //$this->obj = $obj; 
  24. //$this->resourse; 父类中已经实现,此类中可以直接使用 
  25. //$tihs->resourseId; 父类中已经实现,此类中可以直接使用 
  26.  
  27. /** 
  28. * 获取资源操作 
  29. * @return [type] [description] 
  30. */ 
  31. protected function _get(){ 
  32. echo "get"
  33. //逻辑代码根据自己实际项目需要实现 
  34. }  
  35.  
  36. /** 
  37. * 新增资源操作 
  38. * @return [type] [description] 
  39. */ 
  40. protected function _post(){ 
  41. echo "post"
  42. //逻辑代码根据自己实际项目需要实现 
  43.  
  44. /** 
  45. * 删除资源操作 
  46. * @return [type] [description] 
  47. */ 
  48. protected function _delete(){ 
  49. //逻辑代码根据自己实际项目需要实现 
  50.  
  51. /** 
  52. * 更新资源操作 
  53. * @return [type] [description] 
  54. */ 
  55. protected function _put(){ 
  56. echo "put"
  57. //逻辑代码根据自己实际项目需要实现 
  58.  
  59. $server = new testServer(); 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表