zoukankan      html  css  js  c++  java
  • PHP RESTful API

    1.RESTful API 理解

    一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。在当今的互联网应用的前端展示媒介很丰富。有手机、有平板电脑还有PC以及其他的展示媒介。那么这些前端接收到的用户请求统一由一个后台来处理并返回给不同的前端肯定是最科学和最经济的方式,RESTful API就是一套协议来规范多种形式的前端和同一个后台的交互方式。

    2.RESTful API 特点

    (1)表现力更强,更易于理解

    (2)RESTful是无状态的,所以不管前端是何种设备何种状态都可以无差别的请求资源

    (3)使用METHOD(POST,DELETE,PUT,GET)等动词表示增删改查四种操作

    (4)使用URI(通常是其子集URL)来表示对象或资源

    (5)使用queryString表示查询输入

    (6)使用body表示更新和保存的状态输入

    (7)使用HEAD进行扩展

    (8)充分利用 HTTP 协议本身语义

    (9)数据描述简单,一般以xml,json做数据交换

    (10)轻量,直接基于http,不在需要任何别的诸如消息协议。get/post/put/delete为CRUD操作

    (11)面向资源,一目了然,具有自解释性。

    3.RESTful 架构优点

    (1)前后端分离,减少流量

    (2)安全问题集中在接口上,由于接受json格式,防止了注入型等安全问题

    (3)前端无关化,后端只负责处理数据,前端表现方式可以是任何前端语言(android,ios,html5)

    (4)前端和后端人员更加专注于各自开发,只需接口文档便可完成前后端交互,无需过多相互了解

    (5)服务器性能优化:由于前端是静态文件,通过nginx便可获取,服务器主要压力放在了接口上

    4.RESTful 使用规范

    (1)每个资源使用2个URL,网址中只能有名词

    (2)对于资源的操作类型由HTTP动词来表示

    (3)统一的返回结果

    (4)返回正确的状态码

    (5)允许通过HTTP内容协商,建议格式预定义为JSON

    (6)对可选发杂的参数,使用查询字符串(?)

    (7)返回有用的错误信息(message)

    (8)非资源请求用动词

    (9)五种HTTP方法,对应CURD操作

    5.示例

    RESTful API 路由格式(以动物园为例)如下:

    GET  /zoos:列出所有动物园
    POST  /zoos:新建一个动物园
    GET  /zoos/ID:获取某个指定动物园的信息
    PUT  /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
    PATCH  /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
    DELETE  /zoos/ID:删除某个动物园
    GET  /zoos/ID/animals:列出某个指定动物园的所有动物
    DELETE  /zoos/ID/animals/ID:删除某个指定动物园的指定动物
    DELETE  /zoos/ID:删除某个指定动物园
    GET  /zoos/ID/animals/ID: 列出指定某个动物园的的指定动物 ,更好的写法:GET  /zoos/ID?animals=ID

    PHP 路由文件如下:

        //获取动物园列表
        $router->get('zoos', 'ZoosController@list');
        //获取某一个动物园
        $router->get('zoos/{id}', 'ZoosController@get');
        //创建一个动物园
        $router->post('zoos', 'ZoosController@create');
        //更新一个动物园
        $router->put('zoos/{id}', 'ZoosController@update');
        //删除一个动物园
        $router->delete('zoos/{id}', 'ZoosController@delete');

    PHP Controller文件如下:

    <?php
    
    /**
     * 数据操作类
     */
    class ZoosController
    {
        //允许的请求方式
        private static $method_type = array('get', 'post', 'put', 'patch', 'delete');
    
        public static function getRequest()
        {
            //请求方式
            $method = strtolower($_SERVER['REQUEST_METHOD']);
            if (in_array($method, self::$method_type)) {
                //调用请求方式对应的方法
                $data_name = $method . 'Data';
                return self::$data_name($_REQUEST);
            }
            return false;
        }
    
        //GET 获取信息
        private function get($id)
        {
             $zoos=Resp::outs(Zoos::where('id', $id)->first());
             return json_encode(['code'=>200,'msg'=>'success','data'=>$zoos]);
        }
    
         //创建一个动物园
        public function create(Request $request)
        {
            $data = $request->all();
            $res=Resp::outs(Zoos::create($data));
            if($res){
                 return json_encode(['code'=>200,'msg'=>'success']);
            }else{
                 return json_encode(['code'=>400,'msg'=>'error']);
            }
        }
    
        //更新一个活动
        public function update(Request $request, $id)
        {
            $data = $request->all();
            $resResp::outs(Zoos::where('id', $id)->update($data));
             if($res){
                 return json_encode(['code'=>200,'msg'=>'success']);
            }else{
                 return json_encode(['code'=>400,'msg'=>'error']);
            }
        }
    
        //删除一个活动
        public function delete($id)
        {
            $res=Resp::outs(Zoos::where('id', $id)->delete());
            if($res){
                 return json_encode(['code'=>200,'msg'=>'success']);
            }else{
                 return json_encode(['code'=>400,'msg'=>'error']);
            }
        }
    
    }
    

    6.总结

    一个适用于简单操作的接口规范而已,无规矩不成方圆,复杂操作并不适用,还是看业务发展需求的。

    适合CRUD并且只适合CRUD,有的浏览器可能不支持POST、GET之外的提交方式,要特殊处理,API容易给让误解中能进行增、删、查、改等操作。

    RESTful风格只是一种架构风格,一种思想,我们不能一概的说它的好或不好。存在即合理,在软件开发过程中,无论是采用RPC风格还是RESTful,只要是适合自己业务就是最好的。

  • 相关阅读:
    explode — 使用一个字符串分割另一个字符串
    echo — 输出一个或多个字符串
    count_chars — 返回字符串所用字符的信息
    convert_uuencode — 使用 uuencode 编码一个字符串
    convert_uudecode — 解码一个 uuencode 编码的字符串
    convert_cyr_string — 将字符由一种 Cyrillic 字符转换成另一种
    chunk_split — 将字符串分割成小块
    chr — 返回指定的字符
    addslashes — 使用反斜线引用字符串
    addcslashes — 以 C 语言风格使用反斜线转义字符串中的字符
  • 原文地址:https://www.cnblogs.com/jackzhuo/p/12964474.html
Copyright © 2011-2022 走看看