Если я выдаю HTTP DELETE, как я могу получить доступ к телу/переменной PHP? Я знаю, что если вы отправляете POST, вы получаете доступ к нему через $_POST['varname']
, но как получить доступ к нему, если он удаляет не POST? Скажем, здесь имя_память - это идентификатор.
Получить переменную удаления PHP
Ответ 1
Возможно, вам придется посмотреть на чтение данных непосредственно из потока php://input
.
Я знаю, это то, как вы должны делать это для запросов PUT
и некоторое быстрое поиск в Google указывает, что метод работает и для DELETE
.
Смотрите здесь для примера. Комментарий здесь говорит, что этот метод работает и для DELETE
.
Вот интересный пример кода, который поможет (из sfWebRequest.class.php платформы symfony 1.4.9 слегка изменено для краткости):
public function initialize(...)
{
... code ...
$request_vars = array();
if (isset($_SERVER['REQUEST_METHOD']))
{
switch ($_SERVER['REQUEST_METHOD'])
{
case 'PUT':
if ('application/x-www-form-urlencoded' === $this->getContentType())
{
parse_str($this->getContent(), $request_vars );
}
break;
case 'DELETE':
if ('application/x-www-form-urlencoded' === $this->getContentType())
{
parse_str($this->getContent(), $request_vars );
}
break;
}
... more code ...
}
public function getContent()
{
if (null === $this->content)
{
if (0 === strlen(trim($this->content = file_get_contents('php://input'))))
{
$this->content = false;
}
}
return $this->content;
}
В этом примере кода параметры запроса PUT
или DELETE
$request_vars
массив $request_vars
. Ограничение заключается в том, что форма (если вы используете один другой заголовок типа содержимого) должна иметь вид "application/x-www-form-urlencoded", некоторые быстрые поиски в Google подтверждают это.
Ответ 2
file_get_contents('php://input')
должен всегда предоставлять вам полный текст запроса. Обратите внимание, что он может быть доступен только один раз. Большой вопрос заключается в том, может ли запрос DELETE содержать тело, которое кажется чем-то вроде вопроса без ответа, но, вероятно, будет работать.
Я бы сказал, что отправка идентификатора в тело несколько RESTless. Сущность, о которой идет речь, должна указываться URL-адресом как example.com/foo/42
, поэтому запрос DELETE должен указывать DELETE /foo/42
, а не DELETE /foo
с идентификатором в теле запроса.
Ответ 3
Как указано выше, PHP не имеет глобальной переменной для быстрого доступа к данным в запросе DELETE
. Почему я не знаю; он, вероятно, не использовался как GET
и POST
исторически.
Вам нужно будет проверить тип запроса с помощью $_SERVER['REQUEST_METHOD']
, а затем извлечь весь объект с помощью потока php://input
и извлечь из него свои данные. Вы можете создать функцию, которая делает это при каждом запросе, и сохраняет ее в глобальной переменной с именем $_DELETE
, если вы хотите, чтобы аналогичный взгляд выглядел на ваш код (предполагая, что вы используете $_POST
и $_GET
). Вы могли бы даже исправить свой PHP, чтобы сделать это, и компилировать собственную версию PHP, но это, конечно, путало бы людей, которые пытаются запустить ваш код на другой установке PHP:)
Ответ 4
Я не думаю, что вы можете получить доступ к нему в глобально доступном массиве, но вы можете определить тип запроса, см. здесь: Обнаружение типа запроса в PHP (GET, POST, PUT или DELETE)