Erkennen des Anforderungstyps in PHP (GET, POST, PUT oder DELETE)

929

Wie kann ich feststellen, welcher Anforderungstyp in PHP verwendet wurde (GET, POST, PUT oder DELETE)?

UnkwnTech
quelle
21
Vergiss HEAD =) nicht (auch OPTIONEN, TRACE und CONNECT, aber ich glaube nicht, dass PHP diese jemals bekommt).
Gnud
4
Wie wäre es PATCH?
Pmpr
1
PATCH funktioniert auch gut. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Antworten:

1327

Durch die Nutzung

$_SERVER['REQUEST_METHOD']

Beispiel

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

Weitere Informationen finden Sie in der Dokumentation zur Variablen $ _SERVER .

Gnud
quelle
126
+1 dazu - im Zweifelsfall liegt var_dump ($ _ SERVER) und die Antwort oft darin.
Paul Dixon
10
Was passiert, wenn Sie auf mypage.php posten? Var = etwas?
Nickf
2
Die Methode ist POST, aber wenn Sie $ _GET verwenden müssen, um diese Variablen zu erhalten, bin ich mir nicht sicher.
OIS
24
@ NathanLong Nach meiner Erfahrung ist das falsch. Wenn Sie auf mypage.php? Var = etwas posten, ist 'etwas' in $_GET['var'].
David Gallagher
14
$_POSTund $_GETsind leider etwas benannt. $_GETEnthält Variablen aus der Abfragekomponente der URL, unabhängig von der HTTP-Methode. $_POSTenthält Formularfelder, wenn die Anfrage als gesendet wurde application/x-www-form-urlencoded.
Pj Dietz
223

REST in PHP kann ziemlich einfach durchgeführt werden. Erstellen Sie http://example.com/test.php (siehe unten). Verwenden Sie diese Option für REST-Aufrufe, z . B. http://example.com/test.php/testing/123/hello . Dies funktioniert sofort mit Apache und Lighttpd, und es sind keine Umschreiberegeln erforderlich.

<?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
quelle
20
Wenn Sie möchten, dass Ihre API verfügbar ist, ohne anzugeben, welche Interpretations-Engine Sie verwenden, fügen Sie eine .htaccess-Datei mit RewriteEngine auf RewriteRule ^ api /(.*)$ api.php / $ 1 hinzu. Dies setzt voraus, dass Ihre API-Datei api heißt. php. Da der obige Codeblock geschrieben wurde, haben die PHP-Entwickler die Split-Funktion abgeschrieben. Es funktioniert gut, wenn Sie Split durch Explode ersetzen.
JonTheNiceGuy
10
Was ist mit dem @vor $_SERVER['PATH_INFO']?
Svish
10
@Svish, was für ein tolles Detail du bemerkt hast! Es wird entfernt, PHP Notice: Undefined index: PATH_INFOfalls PATH_INFO nicht vorhanden ist $_SERVER. Ich füge das sofort meiner Trickkiste hinzu! Es ist eine Art zu sagen: "Ich weiß, dass es in diesem Array möglicherweise keinen so benannten Eintrag gibt, und ich bin bereit dafür. Halten Sie einfach die Klappe und tun Sie, was ich Ihnen sage." :) Danke Jungs, sowohl für das Posten dieser Antwort als auch dafür, dass ich meine Aufmerksamkeit auf diesen bestimmten Charakter darin gelenkt habe.
Inkredibl
16
Normalerweise benutze ich ein! Leer anstelle von @. Besser üben?
Geilt
8
<?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
Um es
21

Das Erkennen der HTTP-Methode oder der so genannten HTTP-Methode REQUEST METHODkann mithilfe des folgenden Codeausschnitts erfolgen.

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

Sie können dies auch mit a tun, switchwenn Sie dies der if-elseAnweisung vorziehen .

Wenn eine andere Methode als GEToder POSTin einem HTML-Formular erforderlich ist, wird dies häufig mithilfe eines ausgeblendeten Felds im Formular gelöst.

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

Weitere Informationen zu HTTP-Methoden finden Sie in der folgenden StackOverflow-Frage:

PUT und DELETE des HTTP-Protokolls und ihre Verwendung in PHP

Peter
quelle
12

Wir können auch den input_filter verwenden , um die Anforderungsmethode zu erkennen und gleichzeitig Sicherheit durch Eingabesanierung zu gewährleisten.

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

Da es sich um REST handelt, reicht es nicht aus, nur die Anforderungsmethode vom Server abzurufen. Sie müssen auch RESTful-Routenparameter erhalten. Der Grund für die Trennung von RESTful-Parametern und GET / POST / PUT-Parametern besteht darin, dass eine Ressource zur Identifizierung eine eigene eindeutige URL haben muss.

Hier ist eine Möglichkeit, RESTful-Routen in PHP mit Slim zu implementieren:

https://github.com/codeguy/Slim

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

Und konfigurieren Sie den Server entsprechend.

Hier ist ein weiteres Beispiel mit 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
quelle
Nicht das, wonach das OP gefragt hatte. Außerdem erwähnte das OP REST nirgendwo.
Bruno Ferreira
@BrunoFerreira Möchten Sie, dass ich die Antwort lösche, weil OP den Begriff REST nicht speziell verwendet hat?
Nurettin
7

Es ist sehr einfach, benutze einfach $ _SERVER ['REQUEST_METHOD'];

Beispiel:

<?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
quelle
1
Der Fall "DELETE" wird niemals getroffen, da dies keine mögliche REQUEST_METHOD ist. Die gültigen REQUEST_METHODs sind 'GET', 'HEAD', 'POST', 'PUT'. Lesen Sie die Dokumentation (auf die in zahlreichen Antworten auf dieser Seite verwiesen wird), bevor Sie eine Antwort veröffentlichen.
Patrick
1
@Patrick, tatsächlich wird der Fall "DELETE" getroffen, wenn die Anforderungsmethode DELETE ist. Die Dokumentation in PHP erwähnt dies jedoch nicht. In der Tat spiegelt sich jede Methode in $_SERVER['REQUEST_METHOD']selbst angepassten wider . Denken Sie daran, dass die Methode nur eine Zeichenfolge im Anforderungsheader ist und dass es unsere Aufgabe ist, die Richtigkeit zu überprüfen.
Ivan De Paz Centeno
1
@Patrick DELETE ist in RFC7231 definiert und wird in allen gängigen Browsern unterstützt. tools.ietf.org/html/rfc7231#section-4.3.5 und $ _SERVER ["REQUEST_METHOD"] sind nur Zeichenfolgen.
Robert Talada
@IvanDePazCenteno Genau. Vertraue niemals Benutzereingaben. Vertraue niemals Benutzereingaben.
Robert Talada
6
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

Auf diese Weise können Sie auch in Zend Framework 2 erreichen. Vielen Dank.

Amit Patange
quelle
Sie können im Controller $ request = $ this-> getRequest () erstellen. Und dann $ request-> isPost (). Schauen Sie sich auch $ request-> getMethod () an.
Vasiliy Toporov
4

In Core PHP können Sie Folgendes tun:

<?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
quelle
1

Es ist außerdem wichtig zu beachten, dass PHP alle $_GETParameter auffüllt, auch wenn Sie eine ordnungsgemäße Anfrage eines anderen Typs senden.

Methods in oben Antworten sind völlig richtig, aber wenn Sie zu Additionaly überprüfen möchten GETParameter bei der Handhabung POST, DELETE, PUTetc. Anfrage, müssen Sie die Größe überprüfen $_GETArray.

Karol Sobański
quelle
0

Wenn eine Methode angefordert wurde, hat sie eine array. Also einfach mal reinschauen count().

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

3v4l.org/U51TE

Thielicious
quelle
0

Ich habe diesen Code verwendet. Es sollte funktionieren.

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

Dieser obige Code funktioniert mit REST callsund auch mithtml form

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

Sie können beliebige Abfragezeichenfolgendaten abrufen, z www.example.com?id=2&name=r

Sie müssen Daten mit $_GET['id']oder abrufen $_REQUEST['id'].

Daten posten bedeutet wie Formular, das <form action='' method='POST'>Sie verwenden müssen $_POSToder $_REQUEST.

Rocker-Technologie
quelle