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

Вступление

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

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

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

Хм?

Что ж, мы дошли до того, что я потерял счет.

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

Мой вопрос

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

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


person Community    schedule 14.01.2015    source источник
comment
(Интересный вопрос. В сторону: если вы публикуете фрагмент веб-сайта или книги, полезно процитировать его, чтобы показать, что это не ваш текст, а чужой. Это добавляет контекст, который делает вопрос более читаемым).   -  person halfer    schedule 14.01.2015


Ответы (5)


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

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

Протокол в основном говорит следующее:

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

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

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

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

  • используйте УДАЛИТЬ, когда вам нужно удалить ресурс (относительно отправленного вами URI) в этой системе.

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

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

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


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

В своем приложении php вы можете узнать, какой метод использовался, просмотрев суперглобальный массив $_SERVER и проверив значение поля REQUEST_METHOD.

Итак, из вашего php-приложения вы теперь можете распознать, является ли это запросом DELETE или PUT, например. $_SERVER['REQUEST_METHOD'] === 'DELETE' или $_SERVER['REQUEST_METHOD'] === 'PUT'.

* Также имейте в виду, что некоторые приложения, работающие с браузерами, которые не поддерживают методы PUT или DELETE, используют следующий трюк, скрытое поле из html-формы с глаголом, указанным в его атрибуте value, например :

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

Следуйте примеру с небольшим описанием возможного способа обработки этих двух HTTP-запросов

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

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

Теперь, хотя вы можете получать данные из запросов POST и GET с соответствующими глобальными переменными ($_GET, $_POST), в случае запросов PUT и DELETE PHP не предоставляет эти глобальные переменные быстрого доступа; Но вы можете использовать значение $_SERVER['REQUEST_METHOD'] для проверки метода в запросе и, соответственно, обработки вашей логики.

Итак, запрос PUT будет выглядеть так:

PUT /something/index.php

(body) maybe=aparameter

и вы можете получить доступ к этим данным в PHP, прочитав поток php://input, например. с чем-то вроде:

if ($_SERVER['REQUEST_METHOD'] === 'PUT') { 
    $myEntireBody = file_get_contents('php://input'); //Be aware that the stream can only be read once
}

и запрос DELETE будет выглядеть так:

DELETE /something/index.php?maybe=aparameter

и снова вы можете построить свою логику после проверки метода:

if ($_SERVER['REQUEST_METHOD'] === 'DELETE') { 
    // do something
}

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

person ilpaijin    schedule 14.01.2015
comment
Вопрос спрашивает, как использовать PUT и DELETE, и этот ответ объясняет, как использовать GET и POST. - person john ktejik; 20.08.2020
comment
спасибо, ваш комментарий частично верен, и я обновил свой ответ. - person ilpaijin; 28.08.2020

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

$method = $_SERVER['REQUEST_METHOD'];
if ('PUT' === $method) {
    parse_str(file_get_contents('php://input'), $_PUT);
    var_dump($_PUT); //$_PUT contains put fields 
}
person AndreyP    schedule 31.01.2017
comment
[Руководство по PHP]: php.net/manual/ en / features.file-upload.put-method.php рекомендует метод, описанный в этом ответе, для запросов PUT. Я не смог найти справочную страницу для запросов DELETE и обнаружил, что могу получать данные только из строки запроса ($ _GET), а не из любого типа потока (например, php: // input). На странице руководства PHP упоминается обновление конфигурации сервера (в частности, Apache), но это не было необходимо для CentOS7 / PHP7 / httpd2.4.6. - person Brent Self; 15.09.2018
comment
Черт, это 2018 год. Почему до сих пор нет прямой поддержки PUT в PHP. - person Roman; 12.11.2018
comment
@Roman ikr, 2020 вот и часы поиска, и наконец нашел это. Это лучший синтаксический анализ RESTful для операции PUT или обновления без фреймворка. Большое спасибо, Андрей! - person Jeaf Gilbert; 26.02.2020

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

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

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

person CodeCaster    schedule 14.01.2015

Наиболее подходящим местом для использования этих методов (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 метод использовался, чтобы вы могли выполнить действие в соответствии с ним.

Есть много доступных библиотек, которые могут сделать это за вас.

person Ashish Awasthi    schedule 19.01.2015

Что это за методы (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-адрес вы на самом деле имел дело, а затем напишите код для выполнения соответствующего действия.

person Quentin    schedule 14.01.2015
comment
Я был бы осторожен, говоря о загрузке и удалении файла. Технически это влияет на ресурс, идентифицированный URI (он же URL), который может быть или не быть физическим файлом. Обычно в сценариях REST это часто относится к объекту базы данных. - person Rhumborl; 14.01.2015
comment
RFC 2616 устарел. Приведите ссылку на RFC 7231. - person Julian Reschke; 14.01.2015