Данные $_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