file_get_contents ('php: // input') всегда возвращает пустую строку

Я создаю 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:

    1. url-url, который вы использовали, убедитесь, что URL-адрес фактически работает и не возвращает ошибки.
    2. откройте другое окно терминала / консоли и запустите tail -f /path/to/the/php/log/file чтобы вы могли видеть выход этих php-вызовов.
    3. часто люди получают эту ошибку: file_get_contents(file://input): failed to open stream: no suitable wrapper could be found которая может указывать либо на опечатку строки «file: // input», либо на то, что allow_url_fopen отключен в php (см. № 5, если не уверены)
    4. убедитесь, что ваш код верен, и я имею в виду, что вы не вводите неправильные аргументы и вещи … вещи, которые не обязательно подчеркиваются в netbeans.
    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".