我正在尝试为我的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/