检测PHP中的请求类型(GET、POST、PUT或DELETE)

如何检测PHP中使用的请求类型(GET、POST、PUT或DELETE)?

540880 次浏览

通过使用

$_SERVER['REQUEST_METHOD']

示例

if ($_SERVER['REQUEST_METHOD'] === 'POST') {// The request is using the POST method}

有关详细信息,请参阅留档$_SERVER变量

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

由于这是关于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();

并相应地配置服务器。

下面是另一个使用Alto路由器的例子:

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框架2中实现。谢谢!

检测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语句,您也可以使用switch来执行此操作。

如果在超文本标记语言表单中需要GETPOST以外的方法,则通常使用表单中的隐藏字段来解决。

<!-- 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协议的PUT和DELETE及其在PHP中的使用

您可以获得任何查询字符串数据,即www.example.com?id=2&name=r

您必须使用$_GET['id']$_REQUEST['id']获取数据。

发布数据意味着像表单<form action='' method='POST'>一样,您必须使用$_POST$_REQUEST

您可以使用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);

非常简单,只需使用$_SERVER['REQUEST_METHOD'];

示例:

<?php$method = $_SERVER['REQUEST_METHOD'];switch ($method) {case 'GET'://Here Handle GET Requestbreak;case 'POST'://Here Handle POST Requestbreak;case 'DELETE'://Here Handle DELETE Requestbreak;case 'PUT'://Here Handle PUT Requestbreak;}?>

当一个方法被请求时,它将有一个array。所以只需检查count()

$m=['GET'=>$_GET,'POST'=>$_POST];foreach($m as$k=>$v){echo count($v)?$k.' was requested.':null;}

3v4l.org/U51TE

在核心PHP中,您可以这样做:

<?php
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {case 'GET'://Here Handle GET Requestecho 'You are using '.$method.' Method';break;case 'POST'://Here Handle POST Requestecho 'You are using '.$method.' Method';break;case 'PUT'://Here Handle PUT Requestecho 'You are using '.$method.' Method';break;case 'PATCH'://Here Handle PATCH Requestecho 'You are using '.$method.' Method';break;case 'DELETE'://Here Handle DELETE Requestecho 'You are using '.$method.' Method';break;case 'COPY'://Here Handle COPY Requestecho 'You are using '.$method.' Method';break;
case 'OPTIONS'://Here Handle OPTIONS Requestecho 'You are using '.$method.' Method';break;case 'LINK'://Here Handle LINK Requestecho 'You are using '.$method.' Method';break;case 'UNLINK'://Here Handle UNLINK Requestecho 'You are using '.$method.' Method';break;case 'PURGE'://Here Handle PURGE Requestecho 'You are using '.$method.' Method';break;case 'LOCK'://Here Handle LOCK Requestecho 'You are using '.$method.' Method';break;case 'UNLOCK'://Here Handle UNLOCK Requestecho 'You are using '.$method.' Method';break;case 'PROPFIND'://Here Handle PROPFIND Requestecho 'You are using '.$method.' Method';break;case 'VIEW'://Here Handle VIEW Requestecho 'You are using '.$method.' Method';break;Default:echo 'You are using '.$method.' Method';break;}

?>

我用了这个代码。它应该工作。

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>

值得注意的是,PHP将填充所有$_GET参数,即使您发送其他类型的正确请求。

上述回复中的方法是完全正确的,但是如果您想在处理POSTDELETEPUT等请求时额外检查GET参数,则需要检查$_GET数组的大小。

太长别读

“true的本机源”是$_SERVER全局变量。请求方法保存在键“REQUEST_METHOD”下。

查看$_SERVER数组

$_SERVER['REQUEST_METHOD']

php方法

但是你可以使用很多变通方法来获取方法。像filter_input:filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);

Libs或者您使用外部库,例如:

  • Symfony\Component\HttpFoundation\Request
  • \Zend\Http\PhpEnvironment\Request

结论

但最简单的方法是使用:$_SERVER['REQUEST_METHOD']