Angularjs $http POST запрос пустой массив
Следующий $http request
выполняется успешно, но PHP script на другом конце получает пустой массив $_POST
, когда он должен получать "test" и "testval". Любые идеи?
$http({
url: 'backend.php',
method: "POST",
data: {'test': 'testval'},
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).success(function (data, status, headers, config) {
console.log(data);
}).error(function (data, status, headers, config) {});
Ответы
Ответ 1
Если вы хотите отправить только эти простые данные, попробуйте следующее:
$http({
url: 'backend.php',
method: "POST",
data: 'test=' + testval,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).success(function (data, status, headers, config) {
console.log(data);
}).error(function (data, status, headers, config) {});
И php part shoul будет выглядеть следующим образом:
<?php
$data = $_POST['test'];
$echo $data;
?>
Он работает для меня.
Ответ 2
Это распространенная проблема с AngularJS.
Первым шагом является изменение заголовка содержимого по умолчанию для запроса POST:
$http.defaults.headers.post["Content-Type"] =
"application/x-www-form-urlencoded; charset=UTF-8;";
Затем, используя перехватчик запросов XHR, необходимо правильно сериализовать объект полезной нагрузки:
$httpProvider.interceptors.push(['$q', function($q) {
return {
request: function(config) {
if (config.data && typeof config.data === 'object') {
// Check https://gist.github.com/brunoscopelliti/7492579
// for a possible way to implement the serialize function.
config.data = serialize(config.data);
}
return config || $q.when(config);
}
};
}]);
Таким образом, данные полезной нагрузки снова будут доступны в массиве $_ POST.
Подробнее о XHR-перехватчике.
Другая возможность состоит в том, чтобы использовать заголовок типа содержимого по умолчанию, а затем сторона сервера анализирует полезную нагрузку:
if(stripos($_SERVER["CONTENT_TYPE"], "application/json") === 0) {
$_POST = json_decode(file_get_contents("php://input"), true);
}
Ответ 3
Более упрощенный способ:
myApp.config(function($httpProvider) {
$httpProvider.defaults.transformRequest = function(data) {
if (data === undefined) { return data; }
return $.param(data);
};
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});
Ответ 4
Удалите следующую строку и предыдущую запятую:
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
И тогда данные появятся в $_POST. Вам нужна только эта строка, если вы загружаете файл, и в этом случае вам придется декодировать тело, чтобы получить данные vars.
Ответ 5
Я нашел свое решение здесь http://www.peterbe.com/plog/what-stumped-me-about-angularjs. В разделе "AJAX не работает, как jQuery", часть кода, которая решила мою проблему.