Подтвердить что ты не робот

Получить переменную удаления PHP

Если я выдаю HTTP DELETE, как я могу получить доступ к телу/переменной PHP? Я знаю, что если вы отправляете POST, вы получаете доступ к нему через $_POST['varname'], но как получить доступ к нему, если он удаляет не POST? Скажем, здесь имя_память - это идентификатор.

4b9b3361

Ответ 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:)