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