Rilevamento del tipo di richiesta in PHP (GET, POST, PUT o DELETE)


930

Come posso rilevare quale tipo di richiesta è stata utilizzata (GET, POST, PUT o DELETE) in PHP?


21
non dimenticare HEAD =) (anche OPTIONS, TRACE e CONNECT, ma non credo che PHP abbia mai ottenuto quelle).
gnud,

4
Che ne dici PATCH?
Pmpr

1
PATCH funziona anche bene. $_SERVER['REQUEST_METHOD'] === 'PATCH'
Ursuleacv,

Risposte:


1329

Usando

$_SERVER['REQUEST_METHOD']

Esempio

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

Per maggiori dettagli, consultare la documentazione per la variabile $ _SERVER .


126
+1 a quello - in caso di dubbio, var_dump ($ _ SERVER) e la risposta spesso risiede all'interno.
Paul Dixon,

10
Cosa succede se POST to mypage.php? Var = qualcosa?
Nickf,

2
Il metodo sarà POST, ma se devi usare $ _GET per ottenere quelle variabili non sono sicuro.
OIS,

24
@NathanLong Nella mia esperienza non è corretto. Se POST to mypage.php? Var = qualcosa, allora ci sarà "qualcosa" $_GET['var'].
David Gallagher,

14
$_POSTe $_GETsfortunatamente sono chiamati in qualche modo. $_GETcontiene variabili dal componente di query dell'URL, indipendentemente dal metodo HTTP. $_POSTconterrà campi modulo se la richiesta è stata inviata come application/x-www-form-urlencoded.
Pj Dietz,

223

REST in PHP può essere fatto abbastanza semplice. Crea http://example.com/test.php (descritto di seguito). Utilizzalo per le chiamate REST, ad esempio http://example.com/test.php/testing/123/hello . Funziona con Apache e Lighttpd immediatamente e non sono necessarie regole di riscrittura.

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

20
Se vuoi avere la tua API disponibile, senza citare quale motore di interpretazione stai usando, aggiungi un file .htaccess contenente RewriteEngine su RewriteRule ^ api /(.*)$ api.php / $ 1 Questo presuppone che il tuo file API sia chiamato api. php. Inoltre, poiché è stato scritto il blocco di codice sopra riportato, gli sviluppatori PHP hanno deprezzato la funzione split. funziona bene se sostituisci dividi con esplodi.
JonTheNiceGuy

10
Cosa c'è @davanti $_SERVER['PATH_INFO']?
Svish,

10
@Svish, che grande dettaglio hai notato! Si elimina PHP Notice: Undefined index: PATH_INFOnel caso in cui PATH_INFO non sia presente $_SERVER. Sto aggiungendo subito questo alla mia borsa di trucchi! È un modo di dire "So che potrebbe non esserci una voce chiamata così in questo array, e sono pronto per quello, quindi stai zitto e fai quello che ti dico". :) Grazie ragazzi, sia per aver pubblicato questa risposta sia per avermi rivolto la mia attenzione a quel particolare personaggio.
Inkredibl,

16
Di solito uso un! Vuoto anziché @. Pratica migliore?
Geilt,

8
Come modo più conciso, usando metodi variabili: <?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

Il rilevamento del metodo HTTP o cosiddetto REQUEST METHODpuò essere effettuato utilizzando il seguente frammento di codice.

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

Puoi anche farlo usando a switchse preferisci questo rispetto if-elseall'istruzione.

Se un metodo diverso da GETo POSTè richiesto in un modulo HTML, questo viene spesso risolto utilizzando un campo nascosto nel modulo.

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

Per ulteriori informazioni sui metodi HTTP, vorrei fare riferimento alla seguente domanda StackOverflow:

PUT e DELETE del protocollo HTTP e loro utilizzo in PHP


12

Possiamo anche utilizzare input_filter per rilevare il metodo di richiesta e allo stesso tempo fornire sicurezza tramite servizi igienico-sanitari di input.

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

10

Poiché si tratta di REST, non è sufficiente ottenere il metodo di richiesta dal server. È inoltre necessario ricevere i parametri di percorso RESTful. La ragione per separare i parametri RESTful e i parametri GET / POST / PUT è che una risorsa deve avere un proprio URL univoco per l'identificazione.

Ecco un modo per implementare percorsi RESTful in PHP usando Slim:

https://github.com/codeguy/Slim

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

E configurare il server di conseguenza.

Ecco un altro esempio 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');

Non è quello che l'OP ha richiesto. Inoltre, l'OP non ha menzionato REST da nessuna parte.
Bruno Ferreira,

@BrunoFerreira desideri che elimini la risposta perché OP non ha utilizzato specificamente il termine REST?
Nurettin,


7

È molto semplice, basta usare $ _SERVER ['REQUEST_METHOD'];

Esempio:

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

1
Il caso "ELIMINA" non verrà mai colpito perché non è possibile REQUEST_METHOD. I REQUEST_METHOD validi sono 'GET', 'HEAD', 'POST', 'PUT'. Leggi la documentazione (indicata in numerose risposte proprio in questa pagina) prima di pubblicare una risposta.
Patrick,

1
@Patrick, in realtà, il caso "DELETE" avrà un successo quando il metodo di richiesta è DELETE; tuttavia la documentazione in PHP non la menziona. In effetti, qualsiasi metodo si riflette $_SERVER['REQUEST_METHOD'], anche su misura. Ricorda che il metodo è solo una stringa nell'intestazione della richiesta e che è nostro compito verificarne la correttezza.
Ivan De Paz Centeno,

1
@Patrick DELETE è definito in RFC7231 ed è supportato in tutti i principali browser. tools.ietf.org/html/rfc7231#section-4.3.5 e $ _SERVER ["REQUEST_METHOD"] è solo una stringa.
Robert Talada,

@IvanDePazCenteno Esattamente. Non fidarti mai dell'input dell'utente. Non fidarti mai dell'input dell'utente.
Robert Talada,

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

In questo modo puoi anche ottenere in zend framework 2. Grazie.


È possibile effettuare nel controller $ request = $ this-> getRequest (). E poi, $ request-> isPost (). Guarda anche $ request-> getMethod ().
Vasiliy Toporov,

4

Nel core php puoi fare così:

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


?>

1

È utile notare inoltre che PHP popolerà tutti i $_GETparametri anche quando si invia una richiesta corretta di altro tipo.

Metodi di risposte di cui sopra sono del tutto corrette, se si vuole additionaly controllo per GETi parametri durante la manipolazione POST, DELETE, PUT, ecc richiesta, è necessario controllare la dimensione della $_GETmatrice.


0

Quando è stato richiesto un metodo, avrà un array. Quindi controlla semplicemente con count().

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

3v4l.org/U51TE


0

Ho usato questo codice. Dovrebbe funzionare.

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

Questo codice sopra funzionerà REST callse funzionerà anche conhtml form

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

-4

È possibile ottenere qualsiasi dato della stringa di query, ad es www.example.com?id=2&name=r

È necessario ottenere i dati utilizzando $_GET['id']o $_REQUEST['id'].

Pubblica dati significa come il modulo <form action='' method='POST'>che devi usare $_POSTo $_REQUEST.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.