Home  >  Article  >  Backend Development  >  How PHP implements RESTful principles

How PHP implements RESTful principles

Guanhui
GuanhuiOriginal
2020-05-14 17:45:572574browse

How PHP implements RESTful principles

How PHP implements the RESTful principle

First define a request data receiving class; then in the request class, access the unreachable method according to the request type;

 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;
      }
  }

Then define a data output class to uniformly encapsulate the data output format; finally, output the data returned by the method.

  <?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(&#39;error&#39; => "Not Found");
              $message = "Not Found";
          }
  
          header(self::HTTP_VERSION . " $code $message");
          $content_type = isset($_SERVER[&#39;CONTENT_TYPE&#39;]) ? $_SERVER[&#39;CONTENT_TYPE&#39;] : $_SERVER[&#39;HTTP_ACCEPT&#39;];
          if (strpos($content_type, &#39;application/json&#39;) !== false) {
              header("Content-Type: application/json");
              echo self::encodeJson($data);
          }elseif (strpos($content_type, &#39;application/xml&#39;) !== 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(&#39;<?xml version="1.0"?><rest></rest>&#39;);
          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=&#39;1&#39;>";
          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;
      }
  }
  ?>

Recommended tutorial: "PHP Tutorial"

The above is the detailed content of How PHP implements RESTful principles. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:How to forward URL in PHPNext article:How to forward URL in PHP