通过使用
$_SERVER['REQUEST_METHOD']
例子
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// The request is using the POST method
}
有关详细信息,请参阅 documentation for the $_SERVER variable。
PHP 中的 REST 可以非常简单地完成。创建 http://example.com/test.php(概述如下)。将此用于 REST 调用,例如 http://example.com/test.php/testing/123/hello。这适用于开箱即用的 Apache 和 Lighttpd,并且不需要重写规则。
<?php
$method = $_SERVER['REQUEST_METHOD'];
$request = explode("/", substr(@$_SERVER['PATH_INFO'], 1));
switch ($method) {
case 'PUT':
do_something_with_put($request);
break;
case 'POST':
do_something_with_post($request);
break;
case 'GET':
do_something_with_get($request);
break;
default:
handle_error($request);
break;
}
$_SERVER['PATH_INFO']
前面的 @
是怎么回事?
$_SERVER
中,它会删除 PHP Notice: Undefined index: PATH_INFO
。我马上把这个添加到我的技巧包中!这是一种说“我知道在这个数组中可能没有以这种方式命名的条目,我已经准备好了,所以闭嘴,按照我告诉你的去做”。 :) 谢谢大家,无论是发布这个答案还是让我注意到其中的那个特定角色。
<?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
可以使用以下代码片段来检测 HTTP 方法或所谓的 REQUEST METHOD
。
$method = $_SERVER['REQUEST_METHOD'];
if ($method == 'POST'){
// Method is POST
} elseif ($method == 'GET'){
// Method is GET
} elseif ($method == 'PUT'){
// Method is PUT
} elseif ($method == 'DELETE'){
// Method is DELETE
} else {
// Method unknown
}
如果您更喜欢 if-else
语句,也可以使用 switch
来执行此操作。
如果 HTML 表单中需要 GET
或 POST
以外的方法,则通常使用表单中的隐藏字段来解决此问题。
<!-- DELETE method -->
<form action='' method='POST'>
<input type="hidden" name'_METHOD' value="DELETE">
</form>
<!-- PUT method -->
<form action='' method='POST'>
<input type="hidden" name'_METHOD' value="PUT">
</form>
有关 HTTP 方法的更多信息,我想参考以下 StackOverflow 问题:
HTTP protocol's PUT and DELETE and their usage in PHP
您可以使用 getenv
函数,而不必使用 $_SERVER
变量:
getenv('REQUEST_METHOD');
更多信息:
http://php.net/manual/en/function.getenv.php
我们还可以使用 input_filter 检测请求方法,同时还通过输入卫生提供安全性。
$request = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);
由于这是关于 REST 的,因此仅从服务器获取请求方法是不够的。您还需要接收 RESTful 路由参数。分离 RESTful 参数和 GET/POST/PUT 参数的原因是资源需要有自己唯一的 URL 用于标识。
这是使用 Slim 在 PHP 中实现 RESTful 路由的一种方法:
https://github.com/codeguy/Slim
$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
echo "Hello, $name";
});
$app->run();
并相应地配置服务器。
这是另一个使用 AltoRouter 的示例:
https://github.com/dannyvankooten/AltoRouter
$router = new AltoRouter();
$router->setBasePath('/AltoRouter'); // (optional) the subdir AltoRouter lives in
// mapping routes
$router->map('GET|POST','/', 'home#index', 'home');
$router->map('GET','/users', array('c' => 'UserController', 'a' => 'ListAction'));
$router->map('GET','/users/[i:id]', 'users#show', 'users_show');
$router->map('POST','/users/[i:id]/[delete|update:action]', 'usersController#doAction', 'users_do');
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();
这样你也可以在zend framework 2中实现。谢谢。
非常简单,只需使用 $_SERVER['REQUEST_METHOD'];
例子:
<?php
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case 'GET':
//Here Handle GET Request
break;
case 'POST':
//Here Handle POST Request
break;
case 'DELETE':
//Here Handle DELETE Request
break;
case 'PUT':
//Here Handle PUT Request
break;
}
?>
$_SERVER['REQUEST_METHOD']
中,甚至是定制的方法。请记住,该方法只是请求标头中的一个字符串,我们的任务是检查其正确性。
在核心 php 中,您可以这样做:
<?php
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case 'GET':
//Here Handle GET Request
echo 'You are using '.$method.' Method';
break;
case 'POST':
//Here Handle POST Request
echo 'You are using '.$method.' Method';
break;
case 'PUT':
//Here Handle PUT Request
echo 'You are using '.$method.' Method';
break;
case 'PATCH':
//Here Handle PATCH Request
echo 'You are using '.$method.' Method';
break;
case 'DELETE':
//Here Handle DELETE Request
echo 'You are using '.$method.' Method';
break;
case 'COPY':
//Here Handle COPY Request
echo 'You are using '.$method.' Method';
break;
case 'OPTIONS':
//Here Handle OPTIONS Request
echo 'You are using '.$method.' Method';
break;
case 'LINK':
//Here Handle LINK Request
echo 'You are using '.$method.' Method';
break;
case 'UNLINK':
//Here Handle UNLINK Request
echo 'You are using '.$method.' Method';
break;
case 'PURGE':
//Here Handle PURGE Request
echo 'You are using '.$method.' Method';
break;
case 'LOCK':
//Here Handle LOCK Request
echo 'You are using '.$method.' Method';
break;
case 'UNLOCK':
//Here Handle UNLOCK Request
echo 'You are using '.$method.' Method';
break;
case 'PROPFIND':
//Here Handle PROPFIND Request
echo 'You are using '.$method.' Method';
break;
case 'VIEW':
//Here Handle VIEW Request
echo 'You are using '.$method.' Method';
break;
Default:
echo 'You are using '.$method.' Method';
break;
}
?>
另外值得注意的是,即使您发送其他类型的正确请求,PHP 也会填充所有 $_GET
参数。
以上回复中的方法是完全正确的,但是如果您想在处理POST
、DELETE
、PUT
等请求时额外检查GET
参数,则需要检查$_GET
数组的大小。
TL;博士
“真实的本机来源”是 $_SERVER
全局变量。请求方法保存在键“REQUEST_METHOD”下。
检查 $_SERVER 数组
$_SERVER['REQUEST_METHOD']
PHP 方法
但是您可以使用很多变通方法来获取方法。像 filter_input: filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);
库或者您使用外部库,例如:
Symfony\Component\HttpFoundation\Request
\Zend\Http\PhpEnvironment\Request
结论
但最简单的方法是使用:$_SERVER['REQUEST_METHOD']
。
当请求一个方法时,它将有一个 array
。所以只需检查 count()
。
$m=['GET'=>$_GET,'POST'=>$_POST];
foreach($m as$k=>$v){
echo count($v)?
$k.' was requested.':null;
}
我使用了这段代码。它应该工作。
function get_request_method() {
$request_method = strtolower($_SERVER['REQUEST_METHOD']);
if($request_method != 'get' && $request_method != 'post') {
return $request_method;
}
if($request_method == 'post' && isset($_POST['_method'])) {
return strtolower($_POST['_method']);
}
return $request_method;
}
上述代码适用于 REST calls
,也适用于 html form
<form method="post">
<input name="_method" type="hidden" value="delete" />
<input type="submit" value="Submit">
</form>
您可以获得任何查询字符串数据,即 www.example.com?id=2&name=r
您必须使用 $_GET['id']
或 $_REQUEST['id']
获取数据。
发布数据意味着您必须使用 $_POST
或 $_REQUEST
表格 <form action='' method='POST'>
。
$_GET['var']
中。$_POST
和$_GET
的命名有些遗憾。$_GET
包含来自 URL 查询组件的变量,与 HTTP 方法无关。如果请求作为application/x-www-form-urlencoded
发送,$_POST
将包含表单字段。