Подтвердить что ты не робот

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) {});
4b9b3361

Ответ 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.