Angularjs $ http POST запрос пустой массив

Следующий $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», часть кода, которая решила мою проблему.