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

Вступление

Я прочитал следующее:

Протокол передачи гипертекста (HTTP) - это жизнь Интернета. Он используется каждый раз, когда вы переносите документ или делаете запрос AJAX. Но HTTP удивительно неизвестен среди некоторых веб-разработчиков.

Глаголы HTTP составляют основную часть нашего ограничения "единого интерфейса" и предоставляют нам аналог действия основанному на существительном ресурсе. Основными или наиболее часто используемыми глаголами HTTP (или методами, как они правильно называются) являются POST, GET, PUT и DELETE.

А?

Ну, мы пришли к тому, что я потерял след.

PUT а также DELETE, они говорят. Я только слышал о POST а также GET и никогда не видел что-то вроде $_PUT или же $_DELETE проходя мимо в любом PHP-коде, который я когда-либо просматривал.

Мой вопрос

Для чего нужны эти методы (PUT) и (DELETE) и, если возможно, использовать их в PHP, как мне поступить?

Примечание: я знаю, что это на самом деле не проблема, но я всегда пользуюсь возможностью обучения, если вижу ее, и очень хотел бы научиться использовать эти методы в PHP, если это возможно.

6 ответов

Решение

Что это за методы (PUT) и (DELETE) для...

Есть много слов, чтобы потратить, чтобы объяснить это, и я не достаточно опытен, чтобы сделать это, но, как уже было написано, быстрый обзор того, что описывает спецификация HTTP.

Протокол в основном говорит это:

  • Используйте GET, когда вам нужно получить доступ к ресурсу и получить данные, и вам не нужно изменять или изменять состояние этих данных.

  • используйте POST, когда вам нужно отправить некоторые данные на сервер. Ex. из формы, чтобы сохранить эти данные где-нибудь.

  • Используйте HEAD, когда вам нужно получить доступ к ресурсу и получить только заголовки из ответа, без каких-либо данных о ресурсе.

  • используйте PUT, когда вам нужно заменить состояние некоторых данных, уже существующих в этой системе.

  • используйте DELETE, когда вам нужно удалить ресурс (относительно отправленного вами URI) в этой системе.

  • Используйте OPTIONS, когда вам нужно получить параметры связи из ресурса, поэтому для проверки разрешенных методов для этого ресурса. Ex. мы используем его для правил запросов и разрешений CORS.

  • Вы можете прочитать об оставшихся двух методах этого документа, извините, я никогда не использовал его.

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


... и если возможно использовать их в PHP, как бы я поступил об этом.

Из вашего приложения вы должны узнать, какой метод был использован с $_SERVER['REQUEST_METHOD'] и реагировать соответственно.

Некоторые приложения, имеющие дело с браузерами, которые не поддерживают методы PUT или DELETE, используют этот трюк, скрытое поле из html, со значением ex.:

<input name="_method" type="hidden" value="delete" />

Таким образом, из приложения вы теперь можете распознать это как запрос DELETE.


Следуйте простому описанию того, как PHP обрабатывает параметры:

Когда вы (ваш браузер, ваш клиент) запрашиваете ресурс для HTTP-сервера, вы должны использовать один из методов, которые принимает протокол (HTTP). Так что вам нужно пройти:

  • МЕТОД
  • Ури ресурса
  • Заголовки запроса, такие как User-Agent, Host, Content-Length и т. Д.
  • (Необязательное тело запроса)

поэтому запрос должен выглядеть так:

GET /something/index.php?maybe=aparameter

Теперь внутри вашего приложения PHP берет параметры из этого запроса GET и вставляет их в суперглобальный массив (доступный для всех приложений). Таким образом, вы можете получить доступ $_GET['maybe'] который возвращает "aparameter".

В случае запроса POST вы запрашиваете ресурс для HTTP-сервера аналогичным образом, но с важным отличием. Вы предоставляете данные внутри тела запроса:

POST /something/index.php

(body) maybe=aparameter

Теперь внутри вашего приложения PHP из этого POST-запроса берет параметры и вставляет их в суперглобальный (доступный для вашего приложения) массив. Таким образом, вы можете получить доступ $_POST['maybe'] который возвращает "aparameter".

Также обратите особое внимание на код статуса ответа (например, если вы получили запрос PUT и обновили этот ресурс без ошибок, вы должны вернуть статус 204 -Нет контента-).

Способ использования данных PUT из PHP:

$method = $_SERVER['REQUEST_METHOD'];
if ('PUT' === $method) {
    parse_str(file_get_contents('php://input'), $_PUT);
    var_dump($_PUT); //$_PUT contains put fields 
}

РНР $_GET а также $_POST плохо названы. $_GET используется для доступа к значениям параметров строки запроса, и $_POST позволяет получить доступ к телу запроса.

Использование параметров строки запроса не ограничивается запросами GET, и другие виды запросов, кроме простого POST, могут поставляться с телом запроса.

Если вы хотите узнать глагол, использованный для запроса страницы, используйте $_SERVER['REQUEST_METHOD'],

Наиболее подходящим местом для использования этих методов (PUT и DELETE) является REST API. Там, где мы используем методы http для определения режима работы, например, вы хотите получить любые ресурсы, вы можете использовать следующее:

GET http://api.example.com/employee/<any_id>

чтобы добавить новый элемент:

POST http://api.example.com/employee/

обновить или отредактировать:

PUT http://api.example.com/employee/

Удалить существующий ресурс:

DELETE http://api.example.com/employee/1

и т.п.

Сейчас на PHP сторона, которую вам просто нужно прочитать, что HTTP метод, используемый, чтобы вы могли сделать действие в соответствии с этим.

Есть много библиотек, которые могут сделать это для вас. это очень хороший пример: http://phphttpclient.com/

Что это за методы (PUT) и (DELETE)

Там описаны в спецификации HTTP.

В двух словах и несколько упрощая, PUT для загрузки файла на URL и DELETE предназначен для удаления файла из URL.

никогда не пили как то $_PUT или же $_DELETE проходя мимо в любом PHP-коде, который я когда-либо просматривал

$_POST а также $_GET ужасно названы суперглобалами. $_POST для данных, проанализированных из тела запроса. $_GET для данных, проанализированных из URL. Нет ничего, что строго связывало бы данные в любом из этих мест (особенно URL) с конкретным методом запроса.

Запросы DELETE заботятся только о пути URL, поэтому нет данных для анализа.

PUT-запросы обычно заботятся обо всем теле запроса (а не о его разобранной версии), к которому вы обращаетесь file_get_contents('php://input');,

и если возможно использовать их в PHP, как бы я поступил об этом.

Вам необходимо сопоставить URL-адрес с PHP-сценарием (например, с перезаписью URL-адреса), протестировать метод запроса, выяснить, с каким URL вы на самом деле имеете дело, а затем написать код, чтобы выполнить соответствующее действие.

      $GLOBALS["_PUT"]=null;
if($_SERVER['REQUEST_METHOD'] == 'PUT') {
    $form_data= json_encode(file_get_contents("php://input"));
    $key_size=52;
    $key=substr($form_data, 1, $key_size);
    $acc_params=explode($key,$form_data);
    array_shift($acc_params);
    array_pop($acc_params);
    foreach ($acc_params as $item){
        $start_key=' name=\"';
        $end_key='\"\r\n\r\n';
        $start_key_pos=strpos($item,$start_key)+strlen($start_key);
        $end_key_pos=strpos($item,$end_key);
        
        $key=substr($item, $start_key_pos, ($end_key_pos-$start_key_pos));
        
        $end_value='\r\n';
        $value=substr($item, $end_key_pos+strlen($end_key), -strlen($end_value));
        $_PUT[$key]=$value;
    }
    $GLOBALS["_PUT"]=$_PUT;
}

if (!function_exists("getParameter")){
    function getParameter($parameter)
    {
        $value=null;
        if(($_SERVER['REQUEST_METHOD'] == 'POST')&& (isset($_POST[$parameter]))){
            $value=$_POST[$parameter];
        }
        else if(($_SERVER['REQUEST_METHOD'] == 'PUT')&& (isset($GLOBALS["_PUT"][$parameter])))
        {
                $value=$GLOBALS["_PUT"][$parameter];
        }
        else if(($_SERVER['REQUEST_METHOD'] == 'DELETE')&& (isset($_DELETE[$parameter]))){
            $value=$_DELETE[$parameter];
        }
        else if(($_SERVER['REQUEST_METHOD'] == 'PATCH')&& (isset($_PATCH[$parameter]))){
            $value=$_PATCH[$parameter];
        }
        else if(isset($_GET[$parameter])){
            $value=$_GET[$parameter];
        }
        return $value;
    }
}   
Другие вопросы по тегам