Wykrywanie typu żądania w PHP (GET, POST, PUT lub DELETE)

928

Jak mogę wykryć, który typ żądania został użyty (GET, POST, PUT lub DELETE) w PHP?

UnkwnTech
źródło
20
nie zapomnij HEAD =) (także OPTIONS, TRACE i CONNECT, ale nie sądzę, że PHP je kiedykolwiek dostanie).
gnud
4
Jak o PATCH?
Pmpr
1
PATCH działa również dobrze. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Odpowiedzi:

1326

Używając

$_SERVER['REQUEST_METHOD']

Przykład

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

Aby uzyskać więcej informacji, zobacz dokumentację zmiennej $ _SERVER .

gnud
źródło
126
+1 do tego - w razie wątpliwości var_dump ($ _ SERVER) i odpowiedź często leży w środku.
Paul Dixon,
10
Co się stanie, jeśli wyślesz POST do mypage.php? Var = coś?
nickf
2
Metodą będzie POST, ale jeśli musisz użyć $ _GET, aby uzyskać te zmienne, nie jestem pewien.
OIS
24
@NathanLong Z mojego doświadczenia wynika, że ​​jest to nieprawidłowe. Jeśli wyślesz POST do mypage.php? Var = coś, wtedy będzie „coś” $_GET['var'].
David Gallagher,
14
$_POSTi $_GETsą niestety nazwane. $_GETzawierają zmienne z komponentu zapytania adresu URL, niezależnie od metody HTTP. $_POSTbędzie zawierać pola formularza, jeśli żądanie zostało wysłane jako application/x-www-form-urlencoded.
Pj Dietz
223

REST w PHP można zrobić dość prosto. Utwórz http://example.com/test.php (opisane poniżej). Użyj tego do wywołań REST, np . Http://example.com/test.php/testing/123/hello . Działa to z Apache i Lighttpd po wyjęciu z pudełka i nie są wymagane żadne reguły przepisywania.

<?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
źródło
20
Jeśli chcesz mieć dostępne API bez cytowania, jakiego silnika interpretacji używasz, dodaj plik .htaccess zawierający RewriteEngine na RewriteRule ^ api /(.*)$ api.php / $ 1 Zakłada się, że plik API nazywa się api. php. Ponadto, ponieważ napisano powyższy blok kodu, programiści PHP zdeprecjonowali funkcję split. działa dobrze, jeśli zamienisz split na wybuch.
JonTheNiceGuy
10
Co jest z @przodu $_SERVER['PATH_INFO']?
Svish
10
@Svish, jaki wspaniały szczegół zauważyłeś! Pozbywa się PHP Notice: Undefined index: PATH_INFOna wypadek, gdyby PATH_INFO nie było $_SERVER. Od razu dodaję to do mojej torby sztuczek! Jest to sposób na powiedzenie „Wiem, że w tej tablicy może nie być wpisu o takiej nazwie i jestem na to gotowy, więc po prostu zamknij się i zrób to, co ci powiem”. :) Dzięki chłopaki, zarówno za opublikowanie tej odpowiedzi, jak i za zwrócenie mojej uwagi na tę konkretną postać.
inkredibl
16
Zwykle używam! Pustego zamiast @. Lepsza praktyka?
geilt
8
Jako bardziej zwięzły sposób przy użyciu metod zmiennych: <?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

Wykrywanie metody HTTP lub tzw. REQUEST METHODMoże być wykonane przy użyciu następującego fragmentu kodu.

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

Możesz to również zrobić za pomocą a, switchjeśli wolisz to od if-elseinstrukcji.

Jeśli w formularzu HTML wymagana jest metoda inna niż GETlub POST, często jest to rozwiązywane za pomocą ukrytego pola w formularzu.

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

Aby uzyskać więcej informacji dotyczących metod HTTP, chciałbym odnieść się do następującego pytania StackOverflow:

PUT i DELETE protokołu HTTP oraz ich użycie w PHP

Piotr
źródło
12

Możemy również użyć filtra_wejściowego do wykrycia metody żądania, zapewniając jednocześnie bezpieczeństwo poprzez kontrolę urządzeń wejściowych.

$request = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);
HelpNeeder
źródło
10

Ponieważ chodzi o REST, samo pobranie metody żądania z serwera nie wystarczy. Musisz także otrzymać parametry trasy RESTful. Powodem oddzielenia parametrów RESTful i GET / POST / PUT jest to, że zasób musi mieć swój własny unikalny adres URL do identyfikacji.

Oto jeden ze sposobów implementacji tras RESTful w PHP przy użyciu Slim:

https://github.com/codeguy/Slim

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

I odpowiednio skonfiguruj serwer.

Oto kolejny przykład użycia 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
źródło
Nie o to prosił PO. Ponadto OP nie wspomniał nigdzie o REST.
Bruno Ferreira,
@BrunoFerreira, czy chcesz, żebym usunął odpowiedź, ponieważ OP nie użył terminu REST?
nurettin
7

Jest to bardzo proste, wystarczy użyć $ _SERVER ['REQUEST_METHOD'];

Przykład:

<?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
źródło
1
Przypadek „DELETE” nigdy nie zostanie trafiony, ponieważ nie jest to możliwe REQUEST_METHOD. Prawidłowe REQUEST_METHOD to „GET”, „HEAD”, „POST”, „PUT”. Przeczytaj dokumentację (wskazaną w wielu odpowiedziach na tej samej stronie) przed opublikowaniem odpowiedzi.
Patrick
1
@ Patric, w rzeczywistości sprawa „DELETE” otrzyma trafienie, gdy metoda żądania to DELETE; jednak dokumentacja w PHP nie wspomina o tym. Rzeczywiście, każda metoda zostaje odzwierciedlona $_SERVER['REQUEST_METHOD'], nawet dostosowana. Pamiętaj, że metoda jest tylko ciągiem w nagłówku żądania i naszym zadaniem jest sprawdzenie jej poprawności.
Ivan De Paz Centeno
1
@Patrick DELETE jest zdefiniowany w RFC7231 i jest obsługiwany we wszystkich głównych przeglądarkach. tools.ietf.org/html/rfc7231#section-4.3.5 i $ _SERVER [„REQUEST_METHOD”] to tylko ciąg znaków.
Robert Talada
@IvanDePazCenteno Dokładnie. Nigdy nie ufaj wkładowi użytkownika. Nigdy nie ufaj wkładowi użytkownika.
Robert Talada
6
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

W ten sposób możesz również osiągnąć w Zend Framework 2. Dzięki.

Amit Patange
źródło
Możesz zrobić w kontrolerze $ request = $ this-> getRequest (). A potem $ request-> isPost (). Sprawdź także $ request-> getMethod ().
Wasilij Toporow
4

W podstawowym php możesz to zrobić w następujący sposób:

<?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
źródło
1

Warto dodatkowo zauważyć, że PHP zapełni wszystkie $_GET parametry, nawet jeśli wyślesz odpowiednie żądanie innego typu.

Metody powyższych odpowiedzi są całkowicie poprawne, jednak jeśli chcesz dodatkowo odprawy dla GETparametrów podczas obsługi POST, DELETE, PUTitp wniosek, trzeba sprawdzić rozmiar $_GETtablicy.

Karol Sobański
źródło
0

Gdy zażądano metody, będzie miała ona array. Więc po prostu sprawdź za pomocą count().

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

3v4l.org/U51TE

Thielicious
źródło
0

Użyłem tego kodu. To powinno działać.

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

Powyższy kod będzie działał z, REST callsa także będzie działałhtml form

<form method="post">
    <input name="_method" type="hidden" value="delete" />
    <input type="submit" value="Submit">
</form>
Mahfuz
źródło
-4

Możesz uzyskać dowolne dane ciągu zapytania, tj www.example.com?id=2&name=r

Musisz uzyskać dane za pomocą $_GET['id']lub $_REQUEST['id'].

Prześlij dane oznacza, <form action='' method='POST'>że musisz użyć formularza $_POSTlub $_REQUEST.

Technologia Rockers
źródło