Detección de tipo de solicitud en PHP (GET, POST, PUT o DELETE)

930

¿Cómo puedo detectar qué tipo de solicitud se usó (GET, POST, PUT o DELETE) en PHP?

UnkwnTech
fuente
21
no olvide HEAD =) (también OPTIONS, TRACE y CONNECT, pero no creo que PHP las obtenga).
gnud
44
¿Qué tal PATCH?
Pmpr
1
PARCHE también funciona bien. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Respuestas:

1329

Mediante el uso

$_SERVER['REQUEST_METHOD']

Ejemplo

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

Para obtener más detalles, consulte la documentación de la variable $ _SERVER .

GNUD
fuente
126
+1 a eso: en caso de duda, var_dump ($ _ SERVER) y la respuesta a menudo se encuentran dentro.
Paul Dixon
10
¿Qué sucede si PUBLICAS en mypage.php? Var = something?
nickf
2
El método será POST, pero si tiene que usar $ _GET para obtener esas variables, no estoy seguro.
OIS
24
@NathanLong En mi experiencia eso es incorrecto. Si la POST para mypage.php? Var = algo, entonces 'algo' estará en $_GET['var'].
David Gallagher
14
$_POSTy $_GETson algo lamentablemente nombrados. $_GETcontienen variables del componente de consulta de la URL, independientemente del método HTTP. $_POSTcontendrá campos de formulario si la solicitud se envió como application/x-www-form-urlencoded.
Pj Dietz
223

REST en PHP se puede hacer bastante simple. Cree http://example.com/test.php (descrito a continuación). Use esto para llamadas REST, por ejemplo, http://example.com/test.php/testing/123/hello . Esto funciona con Apache y Lighttpd listos para usar, y no se necesitan reglas de reescritura.

<?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;
}
neu242
fuente
20
Si desea tener su API disponible, sin citar qué motor de interpretación está utilizando, agregue un archivo .htaccess que contenga RewriteEngine en RewriteRule ^ api /(.*)$ api.php / $ 1 Esto supone que su archivo API se llama api. php. Además, desde que se escribió el bloque de código anterior, los desarrolladores de PHP han depreciado la función de división. funciona bien si reemplaza dividir con explotar.
JonTheNiceGuy
10
¿Qué pasa con el @frente de $_SERVER['PATH_INFO']?
Svish
10
@Svish, ¡qué gran detalle notaste! Se elimina PHP Notice: Undefined index: PATH_INFOen caso de que PATH_INFO no esté en $_SERVER. ¡Estoy agregando esto a mi bolsa de trucos de inmediato! Es una forma de decir "Sé que puede que no haya una entrada con ese nombre en esta matriz, y estoy listo para eso, así que cállate y haz lo que te digo". :) Gracias chicos, tanto por publicar esta respuesta como por llamar mi atención sobre ese personaje en particular.
inkredibl
16
Usualmente uso a! Empty en lugar de @. ¿Mejor práctica?
geilt
8
Como una forma más concisa utilizando métodos variables: <?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
SandWyrm
21

La detección del llamado método HTTP REQUEST METHODse puede hacer usando el siguiente fragmento de código.

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

También puede hacerlo usando un switchsi lo prefiere sobre la if-elsedeclaración.

Si se requiere un método distinto de GETo POSTen un formulario HTML, esto a menudo se resuelve utilizando un campo oculto en el formulario.

<!-- 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>

Para obtener más información sobre los métodos HTTP, me gustaría consultar la siguiente pregunta de StackOverflow:

PUT y DELETE del protocolo HTTP y su uso en PHP

Peter
fuente
12

También podemos usar input_filter para detectar el método de solicitud y al mismo tiempo proporcionar seguridad a través del saneamiento de entrada.

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

Como se trata de REST, no basta con obtener el método de solicitud del servidor. También debe recibir los parámetros de ruta RESTful. La razón para separar los parámetros RESTful y los parámetros GET / POST / PUT es que un recurso debe tener su propia URL única para su identificación.

Aquí hay una forma de implementar rutas RESTful en PHP usando Slim:

https://github.com/codeguy/Slim

$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
  echo "Hello, $name";
});
$app->run();

Y configure el servidor en consecuencia.

Aquí hay otro ejemplo usando 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');
nurettin
fuente
No es lo que pidió el OP. Y también, el OP no mencionó REST en ninguna parte.
Bruno Ferreira
@BrunoFerreira, ¿desea que elimine la respuesta porque OP no utilizó específicamente el término REST?
nurettin
7

Es muy simple, solo use $ _SERVER ['REQUEST_METHOD'];

Ejemplo:

<?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;
}
?>
Juned Ansari
fuente
1
El caso "DELETE" nunca se verá afectado porque ese no es un REQUEST_METHOD posible. Los REQUEST_METHOD válidos son 'GET', 'HEAD', 'POST', 'PUT'. Lea la documentación (señalada en numerosas respuestas en esta misma página) antes de publicar una respuesta.
Patrick
1
@Patrick, en realidad, el caso "DELETE" tendrá éxito cuando el método de solicitud sea DELETE; No obstante, la documentación en PHP no lo menciona. De hecho, cualquier método se refleja $_SERVER['REQUEST_METHOD'], incluso los personalizados. Recuerde que el método es solo una cadena en el encabezado de la solicitud y que es nuestra tarea verificar su corrección.
Ivan De Paz Centeno
1
@Patrick DELETE se define en RFC7231 y es compatible con todos los principales navegadores. tools.ietf.org/html/rfc7231#section-4.3.5 y $ _SERVER ["REQUEST_METHOD"] es solo una cadena.
Robert Talada
@IvanDePazCenteno Exactamente. Nunca confíes en la entrada del usuario. Nunca confíes en la entrada del usuario.
Robert Talada
6
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

De esta manera también puede lograr en zend framework 2 también. Gracias.

Amit Patange
fuente
Puede hacer en el controlador $ request = $ this-> getRequest (). Y luego, $ request-> isPost (). Consulte también $ request-> getMethod ().
Vasiliy Toporov
4

En core php puedes hacer así:

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


?>
Shaan Ansari
fuente
1

También es valioso tener en cuenta que PHP completará todos los $_GETparámetros incluso cuando envíe una solicitud adecuada de otro tipo.

Métodos en respuestas anteriores son completamente correctas, sin embargo si quieres adicionalmente cheque de GETparámetros durante la manipulación POST, DELETE, PUT, etc. solicitud, es necesario comprobar el tamaño de la $_GETmatriz.

Karol Sobański
fuente
0

Cuando se solicitó un método, tendrá un array. Así que simplemente consulte con count().

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

3v4l.org/U51TE

Thielicious
fuente
0

Usé este código. Deberia de funcionar.

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

Este código anterior funcionará REST callsy también funcionará conhtml form

<form method="post">
    <input name="_method" type="hidden" value="delete" />
    <input type="submit" value="Submit">
</form>
mahfuz
fuente
-4

Puede obtener cualquier información de cadena de consulta, es decir www.example.com?id=2&name=r

Debe obtener datos utilizando $_GET['id']o $_REQUEST['id'].

Publicar datos significa como formulario <form action='' method='POST'>que debe usar $_POSTo $_REQUEST.

Rockers Technology
fuente