Прочитайте текст необработанного запроса для составных/форм-данных с помощью php в запросе PUT, PATCH, DELETE...


Я пишу библиотеку api restful с нуля, и теперь я столкнулся с общей проблемой: считывание необработанных данных из составных/форм-данных из запроса.

Для запросов POST я знаю, что мне следует использовать $_FILE / $_POST переменные. Но что, если есть ПОЛОЖИТЬ, ИСПРАВЛЕНИЕ или любой другой тип запроса, кроме POST?

  • Возможен ли такой сценарий?
  • Если да, то как я могу прочитать исходное содержимое тела, поскольку, согласно документация она недоступна в php://input?

Примечание: Я уже искал информацию о формате ввода и о том, как его читать, Я просто хочу получить доступ к НЕОБРАБОТАННЫМ данным.

Author: CarlosCarucce, 2016-06-28

3 answers

Но что, если есть запрос PUT, PATCH или любой другой тип запроса, кроме POST?

Ну, так как вы разрабатываете API, то вы тот, кто решает, принимает ли он только POST, PUT, POST + PUT или любая другая комбинация заголовков запросов.

API не должен быть спроектирован так, чтобы " принимать и пытаться обрабатывать " все, что стороннее приложение отправляет в ваш API. Это работа приложения (я имею в виду, приложение, которое подключается к API), чтобы подготовить запрос таким образом, чтобы API его принял.

Имейте в виду, что включение нескольких методов запроса (особенно тех, которые должны обрабатываться по-разному) включает в себя несколько способов обработки запроса (например, безопасность, типы и т.д.). Это в основном означает, что либо вам нужно грамотно разработать процесс обработки запросов, либо вы столкнетесь с проблемами с методами API, вызываемыми с разными типами запросов по-разному, что будет хлопотно.

Если вам нужно получить исходное содержимое запроса - @Адиль Аббаси, похоже, на правильном пути (что касается синтаксического анализа php://input). Но обратите внимание, что php://input недоступен с enctype="составные/данные формы", как описано в документах.

<?php
$input = file_get_contents('php://input');
// assuming it's JSON you allow - convert json to array of params
$requestParams = json_decode($input, true);
if ($requestParams === FALSE) {
   // not proper JSON received - set response headers properly
   header("HTTP/1.1 400 Bad Request"); 
   // respond with error
   die("Bad Request");
}

// proceed with API call - JSON parsed correctly

Если вам нужно использовать enctype="составные/данные формы" - прочитайте о STDIN в Документах потоков ввода-вывода и попробуйте сделать это так:

<?php
$bytesToRead = 4096000;
$input = fread(STDIN, $bytesToRead ); // reads 4096K bytes from STDIN
if ($input === FALSE) {
   // handle "failed to read STDIN"
}
// assuming it's json you accept:
$requestParams = json_decode($input , true);
if ($requestParams === FALSE) {
   // not proper JSON received - set response headers properly
   header("HTTP/1.1 400 Bad Request"); 
   // respond with error
   die("Bad Request");
}
 6
Author: Kleskowy, 2016-08-12 11:27:29

ПОМЕЩЕННЫЕ данные поступают из стандартного ввода, просто преобразуйте необработанные данные в переменную:

        // Parse the PUT variables
        $putdata = fopen("php://input", "r");
        $put_args    = parse_str($putdata);

Или как:

        // PUT variables
        parse_str(file_get_contents('php://input'), $put_args);
 1
Author: Amar Pratap, 2016-08-12 09:54:52

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

  $params = array();
  $method = $_SERVER['REQUEST_METHOD'];

  if ($method == "PUT" || $method == "DELETE") {
      $params = file_get_contents('php://input');

      // convert json to array of params
      $params = json_decode($params, true);
  }
 0
Author: Adil Abbasi, 2016-08-12 10:43:25