美文网首页自己的开发路
PHP 实现 RESTful 风格的 API

PHP 实现 RESTful 风格的 API

作者: 冰镇苏打水 | 来源:发表于2018-07-03 17:02 被阅读27次

    PHP实现 RESTful 风格的 API

    目录详情

    restful/
        - Request.php 数据操作类
        - Response.php 输出类
        - index.php 入口文件
        - .htaccess 重写url
    

    Request.php

    • 包含一个Request类,即数据操作类。

    • 接收到URL的数据后,根据请求URL的方式(GET|POST|PUT|PATCH|DELETE)对数据进行相应的增删改查操作,并返回操作后的结果

        <?php
        /**
        * Request类,
        * 接收到URL的数据后,根据请求URL的方式(GET|POST|PUT|PATCH|DELETE)对数据进行相应的增删改查操作,并返回操作后的结果
        */
        class Request
        {
            // 允许的请求方式
            private static $method_type = array('get', 'post', 'put', 'patch', 'delete');
      
            // 测试数据
            private static $test_class = array(
                1 => array('name'=>'测试一班','count'=>18), 
                2 => array('name'=>'测试二班','count'=>15)
            );
      
            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 static function getData($request_data)
            {
                $class_id = (int)$request_data['class'];
                if ($class_id > 0) {
                    // GET /class/ID: 获取某个指定班的信息
                    return self::$test_class[$class_id];
                }else{ 
                    // GET /class: 列出所有班级
                    return self::$test_class;
                }
            }
      
            // POST /class 新建一个班级
            private static function postData($request_data)
            {
                $class_id = (int)$request_data['class'];
                if ($class_id == 0) {
                    return false;
                }
                $data = array();
                if (!empty($request_data['name']) && isset($request_data['count'])) {
                    $data['name'] = $request_data['name'];
                    $data['count'] = $request_data['count'];
                    self::$test_class[] = $data;
                    return self::$test_class; 
                }else{
                    return false;
                }
            }
      
            // PUT /class/ID 更新某个指定班级的信息(全部信息)
            private static function putData($request_data)
            {
                $class_id = (int)$request_data['class'];
                if ($class_id == 0) {
                    return false;
                }
      
                $data = array();
                if (!empty($request_data['name']) && isset($request_data['count'])) {
                    $data['name'] = $request_data['name'];
                    $data['count'] = (int)$request_data['count'];
                    self::$test_class[$class_id] = $data;
                    return self::$test_class;
                }else{
                    return false;
                }
            }
      
            // PATCH /class/ID 更新某个指定班级的信息 (部分信息)
            private static function pacthData($request_data)
            {
                $class_id = (int)$request_data['class'];
                if ($class_id == 0) {
                    return false;
                }
                if (!empty($request_data['name'])) {
                    self::$test_class[$class_id]['name'] = $request_data['name'];
                }
                if (isset($request_data['count'])) {
                    self::$test_class[$class_id]['count'] = $request_data['count'];
                }
                return self::$test_class;
            }
      
            // DELETE /class/ID 删除某个班
            private static function deleteData($request_data)
            {
                $class_id = (int)$request_data['class'];
                if ($class_id == 0) {
                    return false;
                }
                unset(self::$test_class[$class_id]);
                return self::$test_class;
            }
        }
        ?>
      

    Response.php

    • 包含一个Response类,即输出类。

    • 根据接收到的Content-Type,将Request类返回的数组拼接成对应的格式,加上header后输出

        <?php
        /**
        * 包含一个Response类,即输出类。根据接收到的Content-Type,将Request类返回的数组拼接成对应的格式,加上header后输出
        */
        class Response
        {
            const HTTP_VERSION = "HTTP/1.1";
        
            public function sendResponse($data)
            {
                // 获取数据
                if ($data) {
                    $code = 200;
                    $message = "OK";
                }else{
                    $code = 404;
                    $data = array('error' => "Not Found");
                    $message = "Not Found";
                }
        
                header(self::HTTP_VERSION . " $code $message");
                $content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : $_SERVER['HTTP_ACCEPT'];
                if (strpos($content_type, 'application/json') !== false) {
                    header("Content-Type: application/json");
                    echo self::encodeJson($data);
                }elseif (strpos($content_type, 'application/xml') !== false) {
                    header("Content-Type: application/xml");
                    echo self::encodeXml($data);
                }else{
                    header("Content-Type: text/html");
                    echo self::encodeHtml($data);
                }
            }
        
            // json 格式
            private static function encodeJson($responseData)
            {
                return json_encode($responseData);
            }
        
            // xml 格式
            private static function encodeXml($responseData)
            {
                $xml = new SimpleXMLElement('<?xml version="1.0"?><rest></rest>');
                foreach ($responseData as $key => $value) {
                    if (is_array($value)) {
                        foreach ($value as $k => $v) {
                            $xml->addChild($k,$v);
                        }
                    }else{
                        $xml->addChild($key,$value);
                    }
                }
                return $xml->asXML();
            }
        
            // html 格式
            private static function encodeHtml($responseData)
            {
                $html = "<table border='1'>";
                foreach ($responseData as $key => $value) {
                    $html .= "<tr>";
                    if (is_array($value)) {
                        foreach ($value as $k => $v) {
                            $html .= "<td>$k</td><td>$v</td>";
                        }
                    }else{
                        $html .= "<td>$key</td><td>$value</td>";
                    }
                    $html .= "</tr>";
                }
                $html .="</table>";
                return $html;
            }
        }
        ?>
      

    index.php

    • 入口文件
    • 调用 Request->getRequest 获取数据
    • 调用 Response->sendResponse 处理并返回数据

    .htaccess

    • 重写URL,使URL以 /restful/class/1 形式访问文件

        Options +FollowSymlinks
        RewriteEngine on
        
        # 重写规则
        RewriteRule ^class$   index.php?class=all [nc,qsa]
        RewriteRule ^class/(\d+)$   index.php?class=$1 [nc,qsa]
      

    测试方法

    • 采用 postman 测试

    GET

    • 获取 json 类型
      • image
    • 获取 xml
      • image
    • 获取 html
      • image

    相关文章

      网友评论

        本文标题:PHP 实现 RESTful 风格的 API

        本文链接:https://www.haomeiwen.com/subject/thljuftx.html