设置REST API的请求方法


Set Request Methods for REST API

我正在尝试为我的web应用程序实现RESTful API。
我从一些教程中学到了如何编写REST API服务的类。

然而,在其中一个教程中,他们使用AngularJS在点击按钮时向服务器发送HTTP.delete请求。
如果我不想使用AngularJS,我如何在HTML表单中设置request方法来删除指定的用户?

例如,如果我进入localhost/app/api/user/3
我将以JSON表示获取id为3的User的信息,因为默认的请求方法是GET

如何向localhost/app/api/user/3发送删除请求并删除该用户?

在HTML表单中,只有POST和GET方法

我也不知道PUT是如何工作的…

以下是类:

<?php
class REST {
  public $_request_args = array();
  private $_method = "";
  public $_content_type = "application/json";
  private $_code = 200;
  public function __construct() {
      $this->inputs();
  }
  private function inputs() {
    $this->_method = $this->get_request_method();
    switch($this->_method){
        case "POST":
            $this->_request_args = $this->cleanInputs($_POST);
            break;
        case "GET":
            $this->_request_args = $this->cleanInputs($_GET);
            break;
        case "DELETE":
        case "PUT":
            parse_str(file_get_contents("php://input"),$this->_request_args);
            $this->_request_args = $this->cleanInputs($this->_request_args);
            break;
        default:
            $this->response('Method Not Allowed',405);
            break;
      }
  }
  private function get_status_message(){
      $status = array(
        200 => 'OK', 
        204 => 'No Content',  
        404 => 'Not Found',  
        405 => 'Method Not Allowed',
        406 => 'Not Acceptable',
        500 => 'Internal Server Error');
      return ($status[$this->_code]) ? $status[$this->_code] : $status[500];
  }
  public function get_request_method(){
      $request_method = $_SERVER['REQUEST_METHOD'];
      if ($request_method == 'POST' && array_key_exists('HTTP_X_HTTP_METHOD', $_SERVER)) {
          if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'DELETE') {
            $request_method = 'DELETE';
          } else if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'PUT') {
            $request_method = 'PUT';
          } else {
            throw new Exception("Unexpected Header");
          }
      }
      return $request_method;
  }
  private function cleanInputs($data){
      $clean_input = array();
      if (is_array($data)) {
         foreach ($data as $k => $v) {
            $clean_input[$k] = $this->cleanInputs($v);
         }
      } else {
         if(get_magic_quotes_gpc()) {
            $data = trim(stripslashes($data));
         }
         $data = strip_tags($data);
         $clean_input = trim($data);
      }
      return $clean_input;
   }        
   private function set_headers() {
      header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
      header("Content-Type:".$this->_content_type);
   }
   public function response($data, $status = 200) {
       $this->_code = ($status)? $status : 200;
       $this->set_headers();
       if (is_array($data))
          echo json_encode($data, JSON_PRETTY_PRINT);
       else
          echo $data;
       exit;
    }
}   
?>

//编辑::

<?php
class API extends REST {
public $data = "";
public function processApi() {
    $request_args = explode('/', rtrim($_SERVER["PATH_INFO"], '/'));
    $func = array_shift($request_args);
    if(method_exists($this, $func))
        $this->$func();
    else {
        $this->response('',404); // If the method not exist with in this class "Page not found".
     }
  }
  private function users() {
    if($this->get_request_method() != "GET"){
        $this->response('',405);
    }
    $conn = DBManager::getConnection();
    $stmt = $conn->prepare("SELECT * FROM USER");
    $stmt->execute();
    $result = $stmt->fetchAll();
    $this->response($result);
  }
  private function courses() {
    if($this->get_request_method() != "GET"){
        $this->response('',405);
    }
    $conn = DBManager::getConnection();
      $stmt = $conn->prepare("SELECT * FROM COURSE");
      $stmt->execute();
      $result = $stmt->fetchAll();
      $this->response($result);
   }
   private function subjects() {
       if($this->get_request_method() != "GET"){
          $this->response('',405);
       }
       $conn = DBManager::getConnection();
       $stmt = $conn->prepare("SELECT * FROM SUBJECT");
       $stmt->execute();
       $result = $stmt->fetchAll();
       $this->response($result);
   }
}
$api = new API;
$api->processApi();
?>

我的问题是如果我有一个像这样的表单:

<form action='api/users/3' method='POST'>
    <input type='submit' value='Delete User' />
</form>

如果方法是POST而不是DELETE,我怎么用那个请求删除这个用户呢?

我查了其他帖子,没有这个问题的答案!

浏览器不支持HTML表单中的HTTP DELETE和PUT方法。为了获得对DELETE方法的支持,你可以在你的表单中插入一个伪"方法"(一个隐藏的文本元素),这就是Slim和Breeze路由器/"微框架"处理PUT和DELETE方法的方式。

<form action='api/users/3' method='POST'>
    <input type="hidden" name="_method" value="PUT | DELETE" />
    <input type='submit' value='Delete User' />
</form>

在微风中,使用DELETE方法将在您的PHP脚本中看起来像这样:

delete('/', function(){
    echo 'you made a DELETE request';
});

你也许可以做类似的事情。或者,您可以考虑切换到支持DELETE和PUT的REST路由器或微框架。

对于Google Chrome,您可以安装一个非常有用的扩展,帮助您开发和测试您的REST API: Advanced REST Client

另外,您需要按照如下方式指定HTTP.delete大小写:

case "DELETE":
    parse_str(file_get_contents("php://input"),$this->_request_args);
    $this->_request_args = $this->cleanInputs($this->_request_args);
    break;

processApi()函数似乎有问题,因为这不是你获得参数的方式。

修复你的HTACCESS文件以正确重定向url。

遵循本教程获取更多信息:http://coreymaynard.com/blog/creating-a-restful-api-with-php/