>백엔드 개발 >PHP 문제 >PHP가 RESTful 원칙을 구현하는 방법

PHP가 RESTful 원칙을 구현하는 방법

Guanhui
Guanhui원래의
2020-05-14 17:45:572628검색

PHP가 RESTful 원칙을 구현하는 방법

PHP가 RESTful 원칙을 구현하는 방법

먼저 요청 데이터 수신 클래스를 정의한 다음 요청 유형에 따라 요청 클래스에서 연결할 수 없는 메서드에 액세스합니다.

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

그런 다음 데이터 출력 클래스를 정의하여 형식을 지정합니다. 데이터 출력 통합 캡슐화, 마지막으로 메서드에서 반환된 데이터를 출력할 수 있습니다.

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

추천 튜토리얼: "PHP 튜토리얼"

위 내용은 PHP가 RESTful 원칙을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.