Comment puis-je détecter quel type de requête a été utilisé (GET, POST, PUT ou DELETE) en PHP?
PATCH
?
$_SERVER['REQUEST_METHOD'] === 'PATCH'
Comment puis-je détecter quel type de requête a été utilisé (GET, POST, PUT ou DELETE) en PHP?
PATCH
?
$_SERVER['REQUEST_METHOD'] === 'PATCH'
Réponses:
En utilisant
$_SERVER['REQUEST_METHOD']
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// The request is using the POST method
}
Pour plus de détails, consultez la documentation de la variable $ _SERVER .
$_GET['var']
.
$_POST
et $_GET
sont un peu malheureusement nommés. $_GET
contiennent des variables du composant de requête de l'URL, quelle que soit la méthode HTTP. $_POST
contiendra des champs de formulaire si la demande a été envoyée en tant que application/x-www-form-urlencoded
.
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;
}
@
devant $_SERVER['PATH_INFO']
?
PHP Notice: Undefined index: PATH_INFO
au 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.
<?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
La détection de la méthode HTTP ou de ce que l'on appelle REQUEST METHOD
peut ê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 switch
si vous préférezif-else
instruction.
Si une méthode autre que GET
ou POST
est 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:
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);
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');
Vous pouvez utiliser la getenv
fonction et ne pas avoir à travailler avec une $_SERVER
variable:
getenv('REQUEST_METHOD');
Plus d'informations:
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;
}
?>
$_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.
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();
De cette façon, vous pouvez également réaliser dans zend framework 2 également. Merci.
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;
}
?>
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 GET
paramètres lors de la manipulation POST
, DELETE
, PUT
, etc. demande, vous devez vérifier la taille du $_GET
tableau.
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;
}
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 calls
et fonctionnera également avechtml form
<form method="post">
<input name="_method" type="hidden" value="delete" />
<input type="submit" value="Submit">
</form>
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 $_POST
ou $_REQUEST
.