Я создаю PHP RESTful API, следуя этому руководству. Следующая функция, которая должна возвращать данные, отправленные с запросом, когда используется метод put, возвращает null каждый раз:
file_get_contents('php://input')
.
Я даже скачал и протестировал полный пример кода в учебнике, и он по-прежнему возвращает null.
Я использую cURL и следующую команду, чтобы проверить метод «put»:
curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/clients/ryan
.
Я потратил дни на это и до сих пор не получил его, чтобы прочитать данные json. Что я делаю не так?
Во-первых, я смог запустить этот код, и он работал нормально:
--Terminal--------- //I ran this curl request against my own php file: curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/test.php --PHP-------------- //get the data $json = file_get_contents("php://input"); //convert the string of data to an array $data = json_decode($json, true); //output the array in the response of the curl request print_r($data);
Если это не сработает, проверьте консоль на наличие ошибок и настройки php:
tail -f /path/to/the/php/log/file
чтобы вы могли видеть выход этих php-вызовов. file_get_contents(file://input): failed to open stream: no suitable wrapper could be found
которая может указывать либо на опечатку строки «file: // input», либо на то, что allow_url_fopen
отключен в php (см. № 5, если не уверены) помните, что file_get_contents
работает только тогда, когда allow_url_fopen
установлен в true в ваших настройках PHP. это то, что установлено в php.ini, но вы также можете изменить настройки во время выполнения, написав что-то по строкам следующего кода перед другим кодом:
ini_set("allow_url_fopen", true);
Я написал заголовочный файл с этим кодом:
if($_SERVER["REQUEST_METHOD"] == "POST" && $_SERVER["CONTENT_TYPE"] == "application/json") { $data = file_get_contents("php://input", false, stream_context_get_default(), 0, $_SERVER["CONTENT_LENGTH"]); global $_POST_JSON; $_POST_JSON = json_decode($_REQUEST["JSON_RAW"],true); // merge JSON-Content to $_REQUEST if(is_array($_POST_JSON)) $_REQUEST = $_POST_JSON+$_REQUEST; }
Он проверяет правильный тип контента и читает только столько сообщений, сколько указано в заголовке Content-Length. При получении действительного JSON он создал глобальный массив $ _POST_JSON.
Таким образом, вы можете работать с вашим JSON-контентом подобным образом, как вы это делаете с помощью значений POST, закодированных по URL-адресу.
Пример:
echo $_POST_JSON["address"]; // or echo $_REQUEST["address"];
В Windows комбинация «одиночных» двойных «кавычек», похоже, не работает. Используйте escape для кавычек в ваших json-данных (как показано ниже) и он должен работать
curl -X PUT -d "{\"address\":\"Sunset Boulevard\"}" http://localhost/clients/ryan
Правильный вызов функции:
file_get_contents("php://input");
Вы должны получить сообщение об ошибке, говорящее, что php:input
не существует …
В любом случае PUT
предназначен для загрузки файлов на сервер, если сервер поддерживает его. Обычно вы используете POST
с заголовком Content-Type
соответствующим содержимому.
Я тоже получил эту ошибку, мое решение – изменить формат данных на raw.
Я получаю это от php doc, где он говорит
:php://input is not available with enctype="multipart/form-data".