在PHP中检测请求类型(GET、POST、PUT或DELETE)。
如何在PHP中检测出使用了哪种请求类型(GET、POST、PUT或DELETE)?
PATCH
怎么样?
- Peyman Mohamadpour 2016-06-09
$_SERVER['REQUEST_METHOD'] === 'PATCH'
- ursuleacv 2018-02-14
通过使用
$_SERVER['REQUEST_METHOD']
Example
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// The request is using the POST method
}
更多细节请参见$_SERVER变量的文档。
$_GET['var']
。
- David Gallagher 2012-02-07
$_POST
和$_GET
的名字有点不吉利。$_GET
包含来自URL的查询组件的变量,与HTTP方法无关。如果请求是以application/x-www-form-urlencoded
的方式发送,$_POST
将包含表单字段。
- Pj Dietz 2014-07-23
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']
前面的@
是什么意思?
- Svish 2013-04-19
$_SERVER
的情况下,它可以摆脱PHP Notice: Undefined index: PATH_INFO
。我马上把这个加入到我的技巧袋中!这是在说 "我知道在这个数组中可能没有以这种方式命名的条目,我已经准备好了,所以只要闭嘴,按我说的做"。)谢谢你们,既发表了这个答案,又让我注意到其中的那个特殊字符。
- inkredibl 2013-06-04
- SandWyrm 2013-07-31
可以使用以下代码片段来检测 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
}
如果您更喜欢 switch
而不是 if-else
语句,也可以使用它。
如果 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的问题。
您可以使用getenv
函数而不必使用$_SERVER
变量:
getenv('REQUEST_METHOD');
更多的信息。
我们还可以使用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');
在Core 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;
}
?>
$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']
中,甚至是自定义的方法。记住,方法只是请求头中的一个字符串,我们的任务是检查其正确性。
- Ivan De Paz Centeno 2017-05-01
另外值得注意的是,即使你发送一个其他类型的适当请求,PHP也会填充所有的$_GET
参数。
上述答复中的方法是完全正确的,但是如果你想在处理POST
、DELETE
、PUT
等请求时额外检查GET
参数,你需要检查$_GET
数组的大小。
TL;DR
true的"本地来源"是$_SERVER
全局变量。请求方法被保存在"REQUEST_METHOD"键下。
检查$_SERVER数组。
$_SERVER['REQUEST_METHOD']
PHP的方法
但你可以使用很多变通方法来获得Method。比如filter_input: filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);
Libs或者你使用外部libs,比如说。
Symfony\Component\HttpFoundation\Request
\Zend\Http\PhpEnvironment\Request
Conclusion
但是,最简单的方法是使用。$_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']
来获取数据。
发布数据意味着像<form action='' method='POST'>
这样的表格,你必须使用$_POST
或$_REQUEST
。