PHP 实现 RESTful 风格的 API

PHP实现 RESTful 风格的 API

目录详情

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

Request.php

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

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

       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后输出

       "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('');
              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 = "";
              foreach ($responseData as $key => $value) {
                  $html .= "";
                  if (is_array($value)) {
                      foreach ($value as $k => $v) {
                          $html .= "";
                      }
                  }else{
                      $html .= "";
                  }
                  $html .= "";
              }
              $html .="
    $k$v$key$value
    "; 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 类型
    • PHP 实现 RESTful 风格的 API_第1张图片
      image
  • 获取 xml
    • PHP 实现 RESTful 风格的 API_第2张图片
      image
  • 获取 html
    • PHP 实现 RESTful 风格的 API_第3张图片
      image

你可能感兴趣的:(PHP 实现 RESTful 风格的 API)