Угловая HTTP-почта для PHP и неопределенная

У меня есть форма с тегом ng-submit="login()

В javascript функция получила название fine.

 function LoginForm($scope, $http) { $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; $scope.email = "fsdg@sdf.com"; $scope.password = "1234"; $scope.login = function() { data = { 'email' : $scope.email, 'password' : $scope.password }; $http.post('resources/curl.php', data) .success(function(data, status, headers, config) { console.log(status + ' - ' + data); }) .error(function(data, status, headers, config) { console.log('error'); }); } } 

Я получаю ответ 200 OK из файла PHP, однако возвращенные данные говорят о том, что email и password не определены. Это все php у меня есть

 <?php $email = $_POST['email']; $pass = $_POST['password']; echo $email; ?> 

Любая идея, почему я получаю неопределенные значения POST ?

РЕДАКТИРОВАТЬ

Я хотел бы указать, так как это, кажется, популярный вопрос (но он старый), .success и .error были устаревшими, и вы должны использовать. Then, как @James Gentes указал в итогах

angularjs .post() умолчанию использует заголовок Content-type для application/json . Вы переопределяете это, чтобы передавать данные, закодированные в форме, однако вы не изменяете значение data для передачи соответствующей строки запроса, поэтому PHP не $_POST как вы ожидаете.

Мое предложение состояло в том, чтобы просто использовать параметр angularjs по умолчанию для application/json как заголовок, прочитать исходный ввод в PHP и затем десериализовать JSON.

Это можно сделать в PHP следующим образом:

 $postdata = file_get_contents("php://input"); $request = json_decode($postdata); $email = $request->email; $pass = $request->password; 

В качестве альтернативы, если вы в большой степени полагаетесь на функциональность $_POST , вы можете сформировать строку запроса, например email=someemail@email.com&password=somepassword и отправить ее как данные. Убедитесь, что эта строка запроса закодирована в URL. Если вы jQuery.serialize() вручную (в отличие от использования чего-то вроде jQuery.serialize() ), jQuery.serialize() encodeURIComponent() должен сделать трюк для вас.

Я делаю это на стороне сервера, в начале моего файла init, работает как шарм, и вам не нужно ничего делать в угловом или существующем php-коде:

 if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST)) $_POST = json_decode(file_get_contents('php://input'), true); 

В API, который я разрабатываю, у меня есть базовый контроллер и внутри его метода __construct () у меня есть следующее:

 if(isset($_SERVER["CONTENT_TYPE"]) && strpos($_SERVER["CONTENT_TYPE"], "application/json") !== false) { $_POST = array_merge($_POST, (array) json_decode(trim(file_get_contents('php://input')), true)); } 

Это позволяет мне просто ссылаться на данные json как $ _POST ["var"], когда это необходимо. Прекрасно работает.

Таким образом, если аутентифицированный пользователь подключается к библиотеке, такой как jQuery, который отправляет почтовые данные по умолчанию Content-Type: application / x-www-form-urlencoded или Content-Type: application / json, API будет отвечать без ошибок и будет сделать API немного более дружественным для разработчиков.

Надеюсь это поможет.

Угловой Js Демо-код: –

 angular.module('ModuleName',[]).controller('main', ['$http', function($http){ var formData = { password: 'test pwd', email : 'test email' }; var postData = 'myData='+JSON.stringify(formData); $http({ method : 'POST', url : 'resources/curl.php', data: postData, headers : {'Content-Type': 'application/x-www-form-urlencoded'} }).success(function(res){ console.log(res); }).error(function(error){ console.log(error); }); }]); 

Код сервера: –

 <?php // it will print whole json string, which you access after json_decocde in php $myData = json_decode($_POST['myData']); print_r($myData); ?> 

Из-за углового поведения нет прямого метода для нормального поведения почты на сервере PHP, поэтому вам нужно управлять им в json-объектах.

Поскольку PHP не воспринимает JSON 'application/json' один из них заключается в том, чтобы обновить заголовки и параметры с углового так, чтобы ваш api мог напрямую использовать данные.

Во-первых , параметризуйте свои данные:

 data: $.param({ "foo": $scope.fooValue }) 

Затем добавьте следующее к вашему $http

  headers: { 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' }, 

Если все ваши запросы отправляются на PHP, параметры могут быть установлены глобально в конфигурации следующим образом:

 myApp.config(function($httpProvider) { $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; }); 

Вам необходимо десериализовать данные формы, прежде чем передавать его как второй параметр в .post (). Вы можете достичь этого, используя метод $ .param (data) jQuery. Тогда вы сможете на стороне сервера ссылаться на него как $ .POST ['email'];

Это лучшее решение (IMO), поскольку оно не требует jQuery и не декодирует JSON:

Источник: https://wordpress.stackexchange.com/a/179373 и: https://stackoverflow.com/a/1714899/196507

Резюме:

 //Replacement of jQuery.param var serialize = function(obj, prefix) { var str = []; for(var p in obj) { if (obj.hasOwnProperty(p)) { var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p]; str.push(typeof v == "object" ? serialize(v, k) : encodeURIComponent(k) + "=" + encodeURIComponent(v)); } } return str.join("&"); }; //Your AngularJS application: var app = angular.module('foo', []); app.config(function ($httpProvider) { // send all requests payload as query string $httpProvider.defaults.transformRequest = function(data){ if (data === undefined) { return data; } return serialize(data); }; // set all post requests content type $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; }); 

Пример:

 ... var data = { id: 'some_id', name : 'some_name' }; $http.post(my_php_url,data).success(function(data){ // It works! }).error(function() { // :( }); 

PHP-код:

 <?php $id = $_POST["id"]; ?> 

Это старый вопрос, но стоит упомянуть, что в Angular 1.4 $ httpParamSerializer добавляется и при использовании $ http.post, если мы используем $ httpParamSerializer (params) для передачи параметров, все работает как обычный почтовый запрос, и десериализация JSON не является необходимо на стороне сервера.

https://docs.angularjs.org/api/ng/service/$httpParamSerializer

Мне потребовалось много часов, чтобы понять это, работая с Angular и PHP. Почтовые данные не собирались на PHP в $ _POST

в PHP-коде выполните следующие действия. – Создать переменную $ angular_post_params. Затем выполните следующие $angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));

теперь вы можете получить доступ к своим параметрам, например, от $ _POST

$angular_http_params["key"]

в случае, если вы задавались вопросом о javascript … это то, что я использовал

  var myApp = angular.module('appUsers', []); //var post_params = $.param({ request_type: "getListOfUsersWithRolesInfo" }); var dataObj = { task_to_perform: 'getListOfUsersWithRolesInfo' }; myApp.controller('ctrlListOfUsers', function ($scope, $http) { $http({ method: 'POST', dataType: 'json', url: ajax_processor_url, headers: { 'Content-Type': 'application/json' }, data: dataObj, //transformRequest: function(){}, timeout: 30000, cache: false }). success(function (rsp) { console.log("success"); console.log(rsp); }). error(function (rsp) { console.log("error"); }); });