Détection du type de requête en PHP (GET, POST, PUT ou DELETE)

930

Comment puis-je détecter quel type de requête a été utilisé (GET, POST, PUT ou DELETE) en PHP?

UnkwnTech
la source
21
n'oubliez pas HEAD =) (également OPTIONS, TRACE et CONNECT, mais je ne pense pas que PHP les obtienne).
gnud
4
Et alors PATCH?
Pmpr
1
PATCH fonctionne également très bien. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Réponses:

1329

En utilisant

$_SERVER['REQUEST_METHOD']

Exemple

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

Pour plus de détails, consultez la documentation de la variable $ _SERVER .

gnud
la source
126
+1 à cela - en cas de doute, var_dump ($ _ SERVER) et la réponse se trouve souvent à l'intérieur.
Paul Dixon
10
Que se passe-t-il si vous POSTEZ sur mypage.php? Var = quelque chose?
nickf
2
La méthode sera POST, mais si vous devez utiliser $ _GET pour obtenir ces variables, je ne suis pas sûr.
OIS
24
@NathanLong D'après mon expérience, c'est incorrect. Si vous POSTEZ sur mypage.php? Var = quelque chose, alors "quelque chose" sera dans $_GET['var'].
David Gallagher
14
$_POSTet $_GETsont un peu malheureusement nommés. $_GETcontiennent des variables du composant de requête de l'URL, quelle que soit la méthode HTTP. $_POSTcontiendra des champs de formulaire si la demande a été envoyée en tant que application/x-www-form-urlencoded.
Pj Dietz
223

REST en PHP peut être fait assez simplement. Créez http://example.com/test.php (décrit ci-dessous). Utilisez-le pour les appels REST, par exemple http://example.com/test.php/testing/123/hello . Cela fonctionne avec Apache et Lighttpd prêts à l'emploi, et aucune règle de réécriture n'est nécessaire.

<?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
la source
20
Si vous souhaitez que votre API soit disponible, sans citer le moteur d'interprétation que vous utilisez, ajoutez un fichier .htaccess contenant RewriteEngine sur RewriteRule ^ api /(.*)$ api.php / $ 1 Cela suppose que votre fichier API est appelé api. php. De plus, depuis que le bloc de code ci-dessus a été écrit, les développeurs PHP ont déprécié la fonction de partage. cela fonctionne très bien si vous remplacez split par exploser.
JonTheNiceGuy
10
Qu'est-ce qui se passe @devant $_SERVER['PATH_INFO']?
Svish
10
@Svish, quel grand détail vous avez remarqué! Il s'en débarrasse PHP Notice: Undefined index: PATH_INFOau cas où PATH_INFO ne serait pas dedans $_SERVER. J'ajoute ça à mon sac d'astuces tout de suite! C'est une façon de dire "Je sais qu'il n'y a peut-être pas d'entrée nommée de cette façon dans ce tableau, et je suis prêt pour cela, alors tais-toi et fais ce que je te dis". :) Merci les gars, à la fois pour avoir posté cette réponse et pour avoir attiré mon attention sur ce personnage en particulier.
inkredibl
16
J'utilise généralement un! Empty au lieu de @. Une meilleure pratique?
geilt
8
De manière plus concise en utilisant des méthodes 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 détection de la méthode HTTP ou de ce que l'on appelle REQUEST METHODpeut être effectuée à l'aide de l'extrait de code suivant.

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

Vous pouvez également le faire en utilisant un switchsi vous préférezif-else instruction.

Si une méthode autre que GETou POSTest requise dans un formulaire HTML, cela est souvent résolu en utilisant un champ masqué dans le formulaire.

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

Pour plus d'informations sur les méthodes HTTP, je voudrais me référer à la question StackOverflow suivante:

PUT et DELETE du protocole HTTP et leur utilisation en PHP

Peter
la source
12

Nous pouvons également utiliser le fichier input_filter pour détecter la méthode de demande tout en assurant la sécurité via l'assainissement des entrées.

$request = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);
HelpNeeder
la source
10

Comme il s'agit de REST, il ne suffit pas d'obtenir la méthode de demande du serveur. Vous devez également recevoir les paramètres de route RESTful. La raison de la séparation des paramètres RESTful et des paramètres GET / POST / PUT est qu'une ressource doit avoir sa propre URL unique pour l'identification.

Voici une façon d'implémenter des routes RESTful en PHP à l'aide de Slim:

https://github.com/codeguy/Slim

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

Et configurez le serveur en conséquence.

Voici un autre exemple d'utilisation d'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
la source
Pas ce que le PO a demandé. Et aussi, l'OP n'a mentionné REST nulle part.
Bruno Ferreira
@BrunoFerreira voudriez-vous que je supprime la réponse parce que OP n'a pas utilisé spécifiquement le terme REST?
nurettin
7

C'est très simple, utilisez simplement $ _SERVER ['REQUEST_METHOD'];

Exemple:

<?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
la source
1
Le cas "DELETE" ne sera jamais atteint car ce n'est pas un REQUEST_METHOD possible. Les REQUEST_METHOD valides sont 'GET', 'HEAD', 'POST', 'PUT'. Lisez la documentation (indiquée dans de nombreuses réponses sur cette même page) avant de poster une réponse.
Patrick
1
@Patrick, en fait, le cas "DELETE" obtiendra un hit lorsque la méthode de demande est DELETE; néanmoins la documentation en PHP ne le mentionne pas. En effet, toute méthode se reflète dans $_SERVER['REQUEST_METHOD'], même les personnalisées. N'oubliez pas que la méthode n'est qu'une chaîne dans l'en-tête de la demande et qu'il nous appartient de vérifier son exactitude.
Ivan De Paz Centeno
1
@Patrick DELETE est défini dans la RFC7231 et est pris en charge dans tous les principaux navigateurs. tools.ietf.org/html/rfc7231#section-4.3.5 et $ _SERVER ["REQUEST_METHOD"] n'est qu'une chaîne.
Robert Talada
@IvanDePazCenteno Exactement. Ne faites jamais confiance à l'entrée utilisateur. Ne faites jamais confiance à l'entrée utilisateur.
Robert Talada
6
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

De cette façon, vous pouvez également réaliser dans zend framework 2 également. Merci.

Amit Patange
la source
Vous pouvez faire dans le contrôleur $ request = $ this-> getRequest (). Et puis, $ request-> isPost (). Consultez également $ request-> getMethod ().
Vasiliy Toporov
4

En core php, vous pouvez faire comme ceci:

<?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
la source
1

Il est également important de noter que PHP remplira tous les $_GET paramètres même lorsque vous envoyez une demande appropriée d'un autre type.

Les méthodes dans les réponses ci - dessus sont tout à fait correct, mais si vous voulez additionaly vérifier des GETparamètres lors de la manipulation POST, DELETE, PUT, etc. demande, vous devez vérifier la taille du $_GETtableau.

Karol Sobański
la source
0

Lorsqu'une méthode a été demandée, elle aura un array. Vérifiez donc simplement avec count().

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

3v4l.org/U51TE

Thielicious
la source
0

J'ai utilisé ce code. Ça devrait marcher.

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

Ce code ci-dessus fonctionnera avec REST callset fonctionnera également avechtml form

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

Vous pouvez obtenir toutes les données de chaîne de requête, c.-à-d. www.example.com?id=2&name=r

Vous devez obtenir des données en utilisant $_GET['id']ou$_REQUEST['id'] .

Publier des données signifie comme le formulaire que <form action='' method='POST'>vous devez utiliser $_POSTou $_REQUEST.

Technologie Rockers
la source