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{//请求的tokenconst token="yangyulong"; //请求urlprivate $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();以上所述就是本文的全部内容了,希望大家能够喜欢。