it-swarm.com.ru

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

Я создаю PHP RESTful API, следуя это учебнику. Следующая функция, которая должна возвращать данные, отправленные с запросом при использовании метода put, каждый раз возвращает null:

file_get_contents('php://input')

Я даже скачал и протестировал полный пример кода в учебнике, и он все еще возвращает ноль. 

Я использую cURL и следующую команду для проверки метода put: 

curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/clients/ryan.

Я потратил дни на это и до сих пор не получил его, чтобы прочитать данные JSON. Что я делаю неправильно?

11
Igor

Во-первых, я смог запустить этот код, и он работал нормально:

--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-адрес curl, который вы использовали, убедитесь, что 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. убедитесь, что ваш код правильный, и под этим я подразумеваю, чтобы вы не вводили неверные аргументы и тому подобное ... вещи, которые не обязательно подчеркиваются в сетевых компонентах.
  5. помните, file_get_contents работает, только когда allow_url_fopen установлен в true в ваших настройках PHP. это то, что установлено в php.ini, но вы также можете изменить настройки во время выполнения, написав что-то вроде следующего кода перед другим кодом: 

    ini_set("allow_url_fopen", true);
    
8
Kristian

Как отмечено в другом месте в Интернете , содержимое php://input не проходит, если запрос перенаправлен. Возможно, ваш веб-сервер имеет перенаправление с URL-адреса, начинающегося с www, на URL-адрес без www или с URL-адресов, использующих HTTP, на URL-адреса, использующие HTTPS. Проверьте журналы вашего веб-сервера, чтобы убедиться в этом, и действуйте соответствующим образом, чтобы избежать перенаправления при совершении звонков на веб-службу.

3
Giulio Piancastelli

Я написал заголовочный файл с этим кодом:

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"];
2
Radon8472

Я тоже получил эту ошибку, мое решение - изменить формат данных на raw. 

Я получаю это от php doc где это сказать 

:php://input is not available with enctype="multipart/form-data".
2
Timtcng.sen

Правильный вызов функции:

file_get_contents("php://input");

Вы должны получить сообщение об ошибке, в котором говорится, что php:input не существует ...

В любом случае PUT предназначен для загрузки файлов на сервер, при условии, что сервер его поддерживает. Обычно вы используете POST с заголовком Content-Type, соответствующим содержимому.

1
Niet the Dark Absol

В Windows комбинация «одинарных« двойных »кавычек» не работает. Используйте escape для кавычек в ваших данных JSON (как показано ниже), и это должно работать

curl -X PUT -d "{\"address\":\"Sunset Boulevard\"}" http://localhost/clients/ryan
1
sambha

Я вижу проблему,

Вам нужно добавить filename.php в конце URL-адреса запроса или переписать правила сервера в файле .htaccess, чтобы обойти это.

curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/clients/ryan/{filename.php}

замените {filename.php} на соответствующее имя файла. :)

0
Mandan Sharma