Detectando o tipo de solicitação no PHP (GET, POST, PUT ou DELETE)

930

Como posso detectar qual tipo de solicitação foi usado (GET, POST, PUT ou DELETE) no PHP?

UnkwnTech
fonte
21
não esqueça HEAD =) (também OPTIONS, TRACE e CONNECT, mas acho que o PHP nunca as recebe).
Gnud 12/12/08
4
Que tal PATCH?
Pmpr
1
PATCH também funciona bem. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Respostas:

1329

Usando

$_SERVER['REQUEST_METHOD']

Exemplo

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

Para mais detalhes, consulte a documentação da variável $ _SERVER .

gnud
fonte
126
+1 a isso - em caso de dúvida, var_dump ($ _ SERVER) e a resposta geralmente está dentro.
Paul Dixon
10
O que acontece se você POSTAR para mypage.php? Var = alguma coisa?
nickf
2
O método será POST, mas se você precisar usar $ _GET para obter essas variáveis, não tenho certeza.
OIS
24
@ NathanLong Na minha experiência, isso está incorreto. Se você postar em mypage.php? Var = alguma coisa, então 'alguma' estará dentro $_GET['var'].
David Gallagher
14
$_POSTe $_GETsão um pouco infelizmente chamados. $_GETcontêm variáveis ​​do componente de consulta da URL, independentemente do método HTTP. $_POSTconterá campos de formulário se a solicitação foi enviada como application/x-www-form-urlencoded.
Pj Dietz
223

O REST em PHP pode ser feito de maneira bastante simples. Crie http://example.com/test.php (descrito abaixo). Use isso para chamadas REST, por exemplo, http://example.com/test.php/testing/123/hello . Isso funciona com o Apache e o Lighttpd imediatamente, e não são necessárias regras de reescrita.

<?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
fonte
20
Se você deseja ter sua API disponível, sem citar qual mecanismo de interpretação você está usando, adicione um arquivo .htaccess contendo RewriteEngine em RewriteRule ^ api /(.*)$ api.php / $ 1 Isso pressupõe que seu arquivo API seja chamado api. php. Além disso, desde que o bloco de código acima foi escrito, os desenvolvedores do PHP depreciaram a função de divisão. funciona bem se você substituir a divisão por explodir.
precisa saber é o seguinte
10
O que há com isso @na frente $_SERVER['PATH_INFO']?
Svish
10
@Svish, que grande detalhe você notou! Ele é eliminado PHP Notice: Undefined index: PATH_INFOcaso o PATH_INFO não esteja $_SERVER. Estou adicionando isso ao meu pacote de truques imediatamente! É uma maneira de dizer "Eu sei que pode não haver uma entrada com esse nome nessa matriz, e estou pronto para isso, então cale a boca e faça o que eu mandar". :) Obrigado pessoal, por postar esta resposta e por chamar minha atenção para esse personagem em particular.
inkredibl
16
Eu normalmente uso um! Vazio em vez de @. Melhor prática?
geilt
8
Como uma maneira mais concisa, usando métodos variáveis: <?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
SandWyrm 31/07
21

A detecção do método HTTP ou dos chamados REQUEST METHODpode ser feita usando o seguinte snippet 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
}

Você também pode fazer isso usando a switchse preferir isso ao invés deif-else declaração.

Se um método diferente GETou POSTfor necessário em um formulário HTML, isso geralmente é resolvido usando um campo oculto no formulário.

<!-- 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 obter mais informações sobre métodos HTTP, gostaria de me referir à seguinte pergunta StackOverflow:

PUT e DELETE do protocolo HTTP e seu uso em PHP

Pedro
fonte
12

Também podemos usar o input_filter para detectar o método de solicitação, além de fornecer segurança através do saneamento de entrada.

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

Como se trata de REST, apenas obter o método de solicitação do servidor não é suficiente. Você também precisa receber parâmetros de rota RESTful. O motivo para separar os parâmetros RESTful e os parâmetros GET / POST / PUT é que um recurso precisa ter sua própria URL exclusiva para identificação.

Aqui está uma maneira de implementar rotas RESTful no PHP usando o Slim:

https://github.com/codeguy/Slim

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

E configure o servidor de acordo.

Aqui está outro exemplo usando o 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
fonte
Não é o que o OP pediu. E também, o OP não mencionou o REST em nenhum lugar.
Bruno Ferreira
@BrunoFerreira gostaria que eu excluísse a resposta porque o OP não usou especificamente o termo REST?
Nurettin
10

Você pode usar a getenvfunção e não precisa trabalhar com uma $_SERVERvariável:

getenv('REQUEST_METHOD');

Mais informações:

http://php.net/manual/en/function.getenv.php

Artegon
fonte
7

É muito simples, basta usar $ _SERVER ['REQUEST_METHOD'];

Exemplo:

<?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
fonte
1
O caso "DELETE" nunca será atingido porque não é possível REQUEST_METHOD. Os REQUEST_METHODs válidos são 'GET', 'HEAD', 'POST', 'PUT'. Leia a documentação (apontada em várias respostas nesta página) antes de postar uma resposta.
Patrick
1
@ Patrick, na verdade, o caso "DELETE" será atingido quando o método de solicitação for DELETE; no entanto, a documentação em PHP não a menciona. De fato, qualquer método é refletido $_SERVER['REQUEST_METHOD'], mesmo os personalizados. Lembre-se de que o método é apenas uma string no cabeçalho da solicitação e que é nossa tarefa verificar sua exatidão.
Ivan De Paz Centeno
1
O @Patrick DELETE está definido no RFC7231 e é suportado nos principais navegadores. tools.ietf.org/html/rfc7231#section-4.3.5 e $ _SERVER ["REQUEST_METHOD"] são apenas uma string.
Robert Talada 16/05/19
@IvanDePazCenteno Exatamente. Nunca confie na entrada do usuário. Nunca confie na entrada do usuário.
Robert Talada 16/05/19
6
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

Dessa forma, você também pode obter no zend framework 2 também. Obrigado.

Amit Patange
fonte
Você pode criar no controller $ request = $ this-> getRequest (). E então, $ request-> isPost (). Confira também $ request-> getMethod ().
Vasiliy Toporov 16/01
4

No php principal, você pode fazer assim:

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

É importante notar, adicionalmente, que o PHP preencherá todos os $_GET parâmetros, mesmo quando você enviar uma solicitação adequada de outro tipo.

Métodos em respostas acima são completamente correto, no entanto, se você quiser additionaly cheque de GETparâmetros durante o manuseio POST, DELETE, PUT, etc. pedido, é preciso verificar o tamanho da $_GETmatriz.

Karol Sobański
fonte
0

Quando um método foi solicitado, ele terá um array. Então, basta verificar com count().

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

3v4l.org/U51TE

Thielicious
fonte
0

Eu usei esse código. Deveria 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 acima funcionará REST callse também funcionará comhtml form

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

Você pode obter quaisquer dados da string de consulta, ou seja, www.example.com?id=2&name=r

Você deve obter dados usando $_GET['id']ou$_REQUEST['id'] .

Publicar dados significa como o formulário que <form action='' method='POST'>você deve usar $_POSTou $_REQUEST.

Rockers Technology
fonte