Данные запроса REST не могут быть прочитаны методом «put»

Я пытаюсь разработать RESTful API с PHP без использования фреймворков. При обработке запроса данные клиента не могут быть прочитаны с использованием этого: parse_str(file_get_contents("php://input"), $put_vars);

Вот полный код:

 public static function processRequest() { //get the verb $method = strtolower($_SERVER['REQUEST_METHOD']); $request = new Request(); $data = array(); $put_vars = array(); switch ($method) { case 'get': $data = $_GET; break; case 'post': $data = $_POST; break; case 'put': parse_str(file_get_contents("php://input"), $put_vars); $data = $put_vars; echo $data; break; } $request->setMethod($method); $request->setRequestVars($data); if (isset($data['data'])) { $request->setData(json_decode($data)); echo 'data exists'; } return $request; } 

Я использую cURL для отдыха API и при вводе этой команды: curl -i -X PUT -d '{"name":"a","data":"data1"}' http://localhost/my-rest-api/api/ Я только curl -i -X PUT -d '{"name":"a","data":"data1"}' http://localhost/my-rest-api/api/ это:

Array""

Почему не верны правильные данные?

РЕДАКТИРОВАТЬ

Я также проверил еще один фрагмент кода, который должен быть API и file_get_contents('php://input', true) прежнему возвращает null. Может быть, что-то не так с веб-сервером?

Параметр parse_str используется для синтаксического анализа строки запроса (в форме arg1 = xyz & arg2 = abc), а не JSON. Вам нужно использовать json_decode для разбора строк JSON.

 $data = json_decode(file_get_contents("php://input"), true); 

Вот код, который работает:

 $method = strtolower($_SERVER['REQUEST_METHOD']); $data = array(); switch ($method) { case 'get': $data = $_GET; break; case 'post': $data = $_POST; break; case 'put': $data = json_decode(file_get_contents("php://input"), true); break; } var_dump($data); 

Команда Curl:

 curl -i -X PUT -d '{"name":"a","data":"data1"}' http://my-server/my.php 

Отклик:

 array(2) { ["name"]=> string(1) "a" ["data"]=> string(5) "data1" } 

Может быть, что-то не так с веб-сервером?

На самом деле да. После нескольких ударов головой об этом, я обнаружил, что виновником недостающих данных было следующее:

 Note: Prior to PHP 5.6, a stream opened with php://input could only be read once 

Еще один фрагмент кода обращался к входу php: // перед моим кодом, а на серверах с php <5.6 это заставляло вход потерять.

Только в запросах PUT.