2013-10-06 3 views
14

Выполняется успешно $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) {}); 

ответ

18

Если вы тусклой отправить только что простые данные, попробуйте следующее:

$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 часть Шоул выглядеть так:

<?php 
    $data = $_POST['test']; 
    $echo $data; 
?> 

Он работает для меня.

+0

Я надеялся, что вы можете взглянуть на http://stackoverflow.com/questions/34480438/how-to-grab-php-data-from-angularjs ? Проблема, с которой я сталкиваюсь, схожа, но имеет некоторые отличия от того, что было опубликовано в этой теме. – Zypps987

+0

Спасибо. Я использовал примеры в https://docs.angularjs.org/api/ng/service/$http в разделе «Методы быстрого доступа»: '$ http.get ('/ someUrl', config). Then (successCallback, errorCallback); ' ' $ http.post ('/ someUrl', data, config).затем (successCallback, errorCallback); ' Верхний ответ на этот вопрос объясняет это хорошо: http://stackoverflow.com/questions/19254029/angularjs-http-post-does-not-send-data –

+0

Привет всем, в моем состоянии изменения только заголовков было недостаточно для отправки данных. Я также переопределил метод transformRequest, как указано в ссылке http://corpus.hubwiz.com/2/angularjs/19254029.html, и теперь я успешно отправляю данные на бэкэнд. – katmanco

3

Удалить следующую строку, и предшествующая запятая:

headers: {'Content-Type': 'application/x-www-form-urlencoded'} 

И тогда данные будут отображаться в $ _POST. Вам нужна только эта строка, если вы загружаете файл, и в этом случае вам придется декодировать тело, чтобы получить данные.

+0

Спасибо за ваш ответ. К сожалению, я удалил линию, но не повезло. Команда print_r ($ _ POST) в моем PHP-скрипте по-прежнему возвращает пустой массив. – hawkharris

7

Это распространенная проблема с 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 interceptor.

Другая возможность, то его поддерживать содержание типа заголовка по умолчанию , а затем на стороне сервера разбора полезной нагрузки:

if(stripos($_SERVER["CONTENT_TYPE"], "application/json") === 0) { 
    $_POST = json_decode(file_get_contents("php://input"), true); 
} 
7

Более упрощенный способ:

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'; 
}); 
+2

Я уже проклинал Угловой, но ты дал мне веру. – user2513149

+0

Вы должны проклинать PHP – goodies4uall

Смежные вопросы