Следующий $http request
выполняется успешно, но на другом конце PHP-скрипт получает пустой массив $_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) {});
Если вы хотите отправить только эти простые данные, попробуйте следующее:
$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; ?>
Он работает для меня.
Это распространенная проблема с 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); }
Более упрощенный способ:
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'; });
Удалите следующую строку и предыдущую запятую:
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
И тогда данные появятся в $ _POST. Вам нужна только эта строка, если вы загружаете файл, и в этом случае вам придется декодировать тело, чтобы получить данные.
Я нашел свое решение здесь http://www.peterbe.com/plog/what-stumped-me-about-angularjs . В разделе «AJAX не работает, как jQuery», часть кода, которая решила мою проблему.