Определение типа запроса в PHP (GET, POST, PUT или DELETE)

Как определить, какой тип запроса использовался (GET, POST, PUT или DELETE) в PHP?

не забывайте HEAD =) (также OPTIONS, TRACE и CONNECT, но я не думаю, что PHP когда-либо получит их).

gnud 13.12.2008 02:22

Как насчет PATCH?

Pmpr 09.06.2016 22:36

PATCH тоже отлично работает. $_SERVER['REQUEST_METHOD'] === 'PATCH'

ursuleacv 15.02.2018 01:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
984
3
475 558
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

Используя

$_SERVER['REQUEST_METHOD']

Пример

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

Для получения дополнительной информации см. документация для переменной $ _SERVER.

+1 к этому - если есть сомнения, var_dump ($ _ SERVER) и ответ часто лежит внутри.

Paul Dixon 11.12.2008 14:35

Что произойдет, если вы отправите POST на mypage.php? Var = something?

nickf 11.12.2008 15:21

Метод будет POST, но если вам нужно использовать $ _GET для получения этих переменных, я не уверен.

OIS 11.12.2008 15:50

В случае, если nickf упоминает, вы также можете (возможно) использовать переменную $ _REQUEST. $ _REQUEST содержит значения post, get и cookie. Прочтите документацию на php.net/manual/en/reserved.variables.request.php

gnud 12.12.2008 02:42

@nickf - переменная var из вашего примера будет в $_POST['var']

Nathan Long 10.03.2010 19:48

Если вы просто хотите проверить, опубликована ли форма, вы можете просто сделать if (!empty($_POST)) {.... Однако остерегайтесь $_REQUEST! Неосторожное использование добавляет немало уязвимостей CSRF.

Halil Özgür 30.12.2010 19:20

@Paul Dixon print_r ($ _SERVER) лучше для этого: D

Salman von Abbas 22.04.2011 16:43

@NathanLong По моему опыту, это неверно. Если вы отправите POST на mypage.php? Var = something, тогда «something» будет в $_GET['var'].

David Gallagher 07.02.2012 08:51
$_POST и $_GET названы несколько неудачно. $_GET содержат переменные из компонента запроса URL, независимо от метода HTTP. $_POST будет содержать поля формы, если запрос был отправлен как application/x-www-form-urlencoded.
Pj Dietz 24.07.2014 01:03

$ _SERVER ['REQUEST_METHOD'] что. что нам с этим делать?

Ahmed Syed 17.04.2015 08:36

@MujahedAKAS, вы можете проверить, какой метод используется. Это переменная, которая содержит используемый метод, то есть «GET», «HEAD», «POST», «PUT». Итак, вы можете сделать if ($_SERVER['REQUEST_METHOD'] == 'POST'){ echo "POST received"}.

PhoneixS 03.02.2016 13:46

@gnud, нужен ли нам ===, что будет, если я воспользуюсь ==?

Kasun Siyambalapitiya 06.09.2016 13:37

@Kasun Ты конкретно не необходимость===, нет. Но нет никаких преимуществ в использовании ==, и это хорошая практика, чтобы привыкнуть к использованию === абсолютно везде.

Adowrath 19.02.2018 14:47

REST в PHP можно сделать довольно просто. Создайте http://example.com/test.php (описано ниже). Используйте это для вызовов REST, например http://example.com/test.php/testing/123/hello. Это работает с Apache и Lighttpd из коробки, и никаких правил перезаписи не требуется.

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

Если вы хотите, чтобы ваш API был доступен, не указывая, какой интерпретатор вы используете, добавьте файл .htaccess, содержащий RewriteEngine, в RewriteRule ^ api /(.*)$ api.php / $ 1. Предполагается, что ваш файл API называется api. php. Кроме того, поскольку вышеупомянутый блок кода был написан, разработчики PHP отказались от функции разделения. он отлично работает, если вы замените разделение на разнесение.

JonTheNiceGuy 01.07.2010 15:55

Что с @ перед $_SERVER['PATH_INFO']?

Svish 19.04.2013 14:48

@Svish, какая замечательная деталь вы заметили! Он избавляется от PHP Notice: Undefined index: PATH_INFO в случае, если PATH_INFO отсутствует в $_SERVER. Я сразу добавляю это в свой набор хитростей! Это способ сказать: «Я знаю, что в этом массиве может не быть записи с таким названием, и я готов к этому, поэтому просто заткнись и делай то, что я тебе говорю». :) Спасибо, ребята, как за публикацию этого ответа, так и за то, что привлекли мое внимание к этому конкретному персонажу в нем.

inkredibl 04.06.2013 16:24

Я обычно использую! Empty вместо @. Лучшая практика?

geilt 18.07.2013 13:24

Как более краткий способ использования переменных методов: <?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.2013 23:48

@Svish Знак @ - это средство подавления ошибок, и (из моего перевода) оно означает: «Не говорите мне, когда что-то не так, мистер PHP, потому что я знаю лучше и продумал все возможные варианты, и знать ничего не будет неправильно, и я когда-нибудь понадобится знать о "(без обид, neu242: D) Пишите хороший код, который не будет иметь никаких PHP-уведомлений из-за хорошего кода!

James 16.06.2015 03:57

Сегодня воскресное утро, и, может быть, я сегодня немного тупой, но я не могу понять, в чем польза $ _SERVER ['PATH_INFO'], когда эта переменная не установлена ​​Apache. Я попробовал, и он вернулся пустым!

Ed de Almeida 26.07.2015 18:16

Поскольку речь идет о REST, недостаточно просто получить метод запроса с сервера. Вам также необходимо получить параметры маршрута RESTful. Причина разделения параметров RESTful и параметров GET / POST / PUT заключается в том, что у ресурса должен быть собственный уникальный URL-адрес для идентификации.

Вот один из способов реализации маршрутов RESTful в PHP с помощью Slim:

https://github.com/codeguy/Slim

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

И соответствующим образом настройте сервер.

Вот еще один пример использования 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');

Не то, что просил ОП. А также, OP нигде не упоминал REST.

Bruno Ferreira 14.09.2017 21:25

@BrunoFerreira, вы хотите, чтобы я удалил ответ, потому что OP специально не использовал термин REST?

nurettin 15.09.2017 08:46
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

Таким же образом можно добиться и в zend framework 2. Спасибо.

Вы можете сделать в контроллере $ request = $ this-> getRequest (). А затем $ request-> isPost (). Также обратите внимание на $ request-> getMethod ().

Vasiliy Toporov 16.01.2016 17:01

Обнаружение метода HTTP или так называемого REQUEST METHOD может быть выполнено с помощью следующего фрагмента кода.

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

Вы также можете сделать это с помощью switch, если вы предпочитаете это оператору if-else.

Если в форме HTML требуется другой метод, кроме GET или POST, это часто решается с помощью скрытого поля в форме.

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

Для получения дополнительной информации о методах HTTP я хотел бы обратиться к следующему вопросу StackOverflow:

PUT и DELETE протокола HTTP и их использование в PHP

Вы можете получить любые данные строки запроса, например www.example.com?id=2&name=r.

Вы должны получать данные с помощью $_GET['id'] или $_REQUEST['id'].

Публикация данных означает, что, как и в форме <form action='' method='POST'>, вы должны использовать $_POST или $_REQUEST.

Вы можете использовать функцию getenv и не работать с переменной $_SERVER:

getenv('REQUEST_METHOD');

Больше информации:

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

Мы также можем использовать input_filter для обнаружения метода запроса, а также обеспечить безопасность за счет очистки ввода.

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

It is Very Simple just use $_SERVER['REQUEST_METHOD'];

Пример:

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

Случай «DELETE» никогда не будет задействован, потому что это невозможно REQUEST_METHOD. Допустимые REQUEST_METHOD: «GET», «HEAD», «POST», «PUT». Прочтите документацию (указанную в многочисленных ответах на этой самой странице), прежде чем публиковать ответ.

Patrick 16.04.2017 11:42

@Patrick, на самом деле, случай «DELETE» получит попадание, когда метод запроса - DELETE; тем не менее в документации по PHP об этом не упоминается. Действительно, в $_SERVER['REQUEST_METHOD'] отражается любой метод, даже кастомизированный. Помните, что метод - это просто строка в заголовке запроса и наша задача - проверить его правильность.

Ivan De Paz Centeno 01.05.2017 21:36

@Patrick DELETE определен в RFC7231 и поддерживается во всех основных браузерах. tools.ietf.org/html/rfc7231#section-4.3.5 и $ _SERVER ["REQUEST_METHOD"] - это просто строка.

Robert Talada 16.05.2019 06:32

@IvanDePazCenteno Совершенно верно. Никогда не доверяйте вводу пользователя. Никогда не доверяйте вводу пользователя.

Robert Talada 16.05.2019 06:33

Когда метод был запрошен, у него будет array. Так что просто проверьте с помощью count().

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

3v4l.org/U51TE

В основном php вы можете сделать так:

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


?>

Я использовал этот код. Он должен работать.

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

Этот код выше будет работать с REST calls, а также с html form.

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

Также важно отметить, что PHP заполнит все параметры $_GET, даже если вы отправите правильный запрос другого типа.

Методы в приведенных выше ответах полностью верны, однако, если вы хотите дополнительно проверить параметры GET при обработке запроса POST, DELETE, PUT и т. д., Вам необходимо проверить размер массива $_GET.

Другие вопросы по теме