Я пытаюсь разработать 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.