Данные $_POST пустые, хотя я получаю ответ 200 на POST?

У меня есть PHP-приложение, которое использует AngularJS для клиента, FlightPHP для REST-сервисов и PHP в конце.

Тем не менее, хотя я выдаю POST с этим кодом здесь:

$scope.registerUser = function() {
    $http({
        method: 'POST',
        url: '/user/register',
        data: $scope.user
    }).success(function(data) {
                if (data.result === undefined) {
                    setAjaxMessage(data, false);
                    return;
                }

                if (data.result === 0) {
                    setAjaxMessage(data.message, true);
                }
                else {
                    setAjaxMessage(data.message, false);
                }
            }).error(function(data) {
                setAjaxMessage(data, false);
            });
};

и я получаю успешный POST сообщение через Firefox с Params -> Request payload Вкладка устанавливается на эти данные:

{"displayname":"user1","email":"user1@gmail.com","password":"abc123"}

когда я выдаю эту серверную часть:

Flight::route('POST /user/register', function() {
    echo var_dump($_POST);
    return;

    // register the user
    require 'core/register.php';
});

Я получаю это:

array (size=0)
  empty

Что здесь дает? У меня никогда не было проблем с $_POST данные до. У меня такое ощущение, что это как-то связано с FlightPHP, но я не могу это понять. Это попадает в обработчик для POST как вы видете.

2 ответа

Решение

Хорошо, это немного забавно. Но это из-за FlightPHP. Обычно ответ, предоставленный Майком Брантом, будет на 100% правильным! Однако FlightPHP читает этот ввод раньше, чем я, и согласно документации PHP, его можно прочитать только один раз.

Так, где FlightPHP помещает это? Ха, теперь это странно. Они помещают это в собственность, названную body так что я должен был сделать это, чтобы получить эти значения JSON:

$vars = json_decode(Flight::request()->body, true);

Flight::request()->body возвращает строку JSON. Но тогда это нужно декодировать и превратить в ассоциативный массив, поэтому я передаю true как второй параметр.

Вам нужно получить данные из необработанного ввода PHP, если вы не публикуете строку запроса в кодированной форме (как в случае с необработанным JSON). Вот как вы можете прочитать ваши данные JSON в соответствующую структуру данных PHP:

$post_data = json_decode(file_get_contents('php://input'));

Вы также должны явно установить заголовок Content-type следующим образом:

$http({
    method: 'POST',
    url: '/user/register',
    data: $scope.user,
    headers: {'Content-Type': 'application/json'}
}).success(function(data) {
  // rest of your code
Другие вопросы по тегам