在PHP中检测请求类型(GET,POST,PUT或DELETE)

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

通过使用

 $_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; case 'HEAD': do_something_with_head($request); break; case 'DELETE': do_something_with_delete($request); break; case 'OPTIONS': do_something_with_options($request); break; default: handle_error($request); break; } 

检测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表单中需要使用除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中的使用

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

这很简单,只需使用$ _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; } ?> 

您可以使用getenv函数,而不必使用$_SERVER变量:

 getenv('REQUEST_METHOD'); 

更多信息:

http://php.net/manual/en/function.getenv.php

 $request = new \Zend\Http\PhpEnvironment\Request(); $httpMethod = $request->getMethod(); 

这样你也可以在zend framework 2中实现。 谢谢。

我们也可以使用input_filter来检测请求方法,同时通过输入卫生提供安全性。

 $request = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED); 

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

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

3v4l.org/U51TE

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

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

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