php基于curl扩展制作跨平台的restfule 接口
restfule接口
适用的平台:跨平台
所依赖:curl扩展
git:https://git.oschina.net/anziguoer/restAPI
ApiServer.php
<?php /** *@Author:yangyulong *@Email:anziguoer@sina.com *@Date:2015-04-3005:38:34 *@LastModifiedby:yangyulong *@LastModifiedtime:2015-04-3017:14:11 */ classapiServer { /** *客户端请求的方式 *@varstring */ private$method=''; /** *客户端发送的数据 *@var[type] */ protected$param; /** *要操作的资源 *@var[type] */ protected$resourse; /** *要操作的资源id *@var[type] */ protected$resourseId; /** *构造函数,获取client请求的方式,以及传输的数据 *@paramobject可以自定义传入的对象 */ publicfunction__construct() { //首先对客户端的请求进行验证 $this->authorization(); $this->method=strtolower($_SERVER['REQUEST_METHOD']); //所有的请求都是pathinfo模式 $pathinfo=$_SERVER['PATH_INFO']; //将pathinfo数据信息映射为实际请求方法 $this->getResourse($pathinfo); //获取传输的具体参数 $this->getData(); //执行响应 $this->doResponse(); } /** *根据不同的请求方式,获取数据 *@return[type] */ privatefunctiondoResponse(){ 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数据信息映射为实际请求方法 privatefunctiongetResourse($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; } /** *验证请求 */ privatefunctionauthorization(){ $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] */ privatefunctiongetData(){ //所有的参数都是get传参 $this->param=$_GET; } /** *获取资源操作 *@return[type][description] */ protectedfunction_get(){ //逻辑代码根据自己实际项目需要实现 } /** *新增资源操作 *@return[type][description] */ protectedfunction_post(){ //逻辑代码根据自己实际项目需要实现 } /** *删除资源操作 *@return[type][description] */ protectedfunction_delete(){ //逻辑代码根据自己实际项目需要实现 } /** *更新资源操作 *@return[type][description] */ protectedfunction_put(){ //逻辑代码根据自己实际项目需要实现 } /** *出入服务端返回的数据信息json格式 */ publicfunctionoutPut($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))){ thrownewException('输入的状态码不合法'); }else{ echojson_encode($status[$stat]); } }catch(Exception$e){ die($e->getMessage()); } } }
ApiClient.php
<?php /** *CreatedbyPhpStorm. *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/* ****************************** */ classrestClient { //请求的token consttoken='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发送的数据 *@paraminteger$url_model路由请求方式 */ publicfunction__construct($url,$data=array(),$requestType='get'){ //url是必须要传的,并且是符合PATHINFO模式的路径 if(!$url){ returnfalse; } $this->requestType=strtolower($requestType); $paramUrl=''; //PATHINFO模式 if(!empty($data)){ foreach($dataas$key=>$value){ $paramUrl.=$key.'='.$value.'&'; } $url=$url.'?'.$paramUrl; } //初始化类中的数据 $this->url=$url; $this->data=$data; try{ if(!$this->curl=curl_init()){ thrownewException('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] */ publicfunction_get(){ } /** *[_post设置post请求的参数] *post新增资源 *@return[type][description] */ publicfunction_post(){ curl_setopt($this->curl,CURLOPT_POST,1); curl_setopt($this->curl,CURLOPT_POSTFIELDS,$this->data); } /** *[_put设置put请求] *put更新资源 *@return[type][description] */ publicfunction_put(){ curl_setopt($this->curl,CURLOPT_CUSTOMREQUEST,'PUT'); } /** *[_delete删除资源] *delete删除资源 *@return[type][description] */ publicfunction_delete(){ curl_setopt($this->curl,CURLOPT_CUSTOMREQUEST,'DELETE'); } /** *[doRequest执行发送请求] *@return[type][description] */ publicfunctiondoRequest(){ //发送给服务端验证信息 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; } /** *设置发送的头部信息 */ privatefunctionsetHeader(){ curl_setopt($this->curl,CURLOPT_HTTPHEADER,$this->headers); } /** *生成授权码 *@returnstring授权码 */ privatefunctionsetAuthorization(){ $authorization=md5(substr(md5(self::token),8,24).self::token); return$authorization; } /** *获取curl中的状态信息 */ publicfunctiongetInfo(){ returncurl_getinfo($this->curl); } /** *关闭curl连接 */ publicfunction__destruct(){ curl_close($this->curl); } }
testClient.php
<?php /** *CreatedbyPhpStorm. *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=newrestClient($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-3016:52:53 *@LastModifiedby:yangyulong *@LastModifiedtime:2015-04-3017:26:37 */ include'./ApiServer.php'; classtestServerextendsapiServer { /** *先执行apiServer中的方法,初始化数据 *@paramobject$obj可以传入的全局对象[数据库对象,框架全局对象等] */ private$obj; function__construct()//object$obj { parent::__construct(); //$this->obj=$obj; //$this->resourse;父类中已经实现,此类中可以直接使用 //$tihs->resourseId;父类中已经实现,此类中可以直接使用 } /** *获取资源操作 *@return[type][description] */ protectedfunction_get(){ echo"get"; //逻辑代码根据自己实际项目需要实现 } /** *新增资源操作 *@return[type][description] */ protectedfunction_post(){ echo"post"; //逻辑代码根据自己实际项目需要实现 } /** *删除资源操作 *@return[type][description] */ protectedfunction_delete(){ //逻辑代码根据自己实际项目需要实现 } /** *更新资源操作 *@return[type][description] */ protectedfunction_put(){ echo"put"; //逻辑代码根据自己实际项目需要实现 } } $server=newtestServer();
以上所述就是本文的全部内容了,希望大家能够喜欢。