Post HTTP angular su PHP e non definito

Ho un modulo con il tag ng-submit="login()

La funzione viene chiamata bene in javascript.

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

Ricevo una risposta di 200 OK dal file PHP, tuttavia i dati restituiti indicano che email e password non sono definite. Questo è tutto il php che ho

  

Qualche idea sul perché sto ottenendo valori POST indefiniti?

MODIFICARE

Volevo sottolineare perché questa sembra essere una domanda popolare (ma è vecchia), .success e .error sono stati deprecati e dovresti usare .then come @James Gentes sottolineato negli annunci

angularjs .post() imposta di default l’intestazione Content-type su application/json . Si sta eseguendo l’override di questo passaggio per passare i dati codificati in forma, tuttavia non si sta modificando il valore dei data per passare una stringa di query appropriata, pertanto PHP non $_POST come previsto.

Il mio suggerimento sarebbe di usare semplicemente l’impostazione angularjs predefinita di application/json come header, leggere l’input raw in PHP e poi deserializzare il JSON.

Questo può essere ottenuto in PHP come questo:

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

In alternativa, se stai facendo molto affidamento sulla funzionalità $_POST , puoi creare una stringa di query come email=someemail@email.com&password=somepassword e inviarla come dati. Assicurati che questa stringa di query sia codificata URL. Se creato manualmente (al contrario di usare qualcosa come jQuery.serialize() ), l’ encodeURIComponent() di Javascript dovrebbe fare il trucco per te.

Lo faccio dal lato server, all’inizio del mio file init, funziona come un incantesimo e non devi fare nulla in codice php angular o esistente:

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

Nell’API che sto sviluppando ho un controller di base e all’interno del suo metodo __construct () ho il seguente:

 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)); } 

Ciò mi consente di fare semplicemente riferimento ai dati JSON come $ _POST [“var”] quando necessario. Funziona alla grande.

In questo modo se un utente autenticato si connette con una libreria come jQuery che invia i dati del post con un predefinito Content-Type: application / x-www-form-urlencoded o Content-Type: application / json l’API risponderà senza errori e rendere l’API un po ‘più amichevole per gli sviluppatori.

Spero che questo ti aiuti.

Perché PHP non accetta nativamente 'application/json' Un approccio consiste nell’aggiornare intestazioni e parametri da angolari in modo che la tua API possa utilizzare direttamente i dati.

In primo luogo , parametrizza i tuoi dati:

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

Quindi , aggiungi quanto segue al tuo $http

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

Se tutte le tue richieste vanno in PHP, i parametri possono essere impostati globaly nella configurazione come segue:

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

Codice demo Js angular: –

 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); }); }]); 

Server Side Code: –

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

A causa del comportamento angular non esiste un metodo diretto per il normale comportamento dei post sul server PHP, quindi è necessario gestirlo in oggetti json.

È necessario deserializzare i dati del modulo prima di passarlo come secondo parametro a .post (). Puoi ottenerlo usando il metodo $ .param (dati) di jQuery. Quindi sarai in grado di fare riferimento al server come $ .POST [’email’];

Questa è la soluzione migliore (IMO) in quanto non richiede jQuery e nessuna decodifica JSON:

Fonte: https://wordpress.stackexchange.com/a/179373 e: https://stackoverflow.com/a/1714899/196507

Sommario:

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

Esempio:

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

Codice PHP:

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

È una vecchia domanda, ma vale la pena menzionare che in Angular 1.4 $ httpParamSerializer viene aggiunto e quando si usa $ http.post, se usiamo $ httpParamSerializer (params) per passare i parametri, tutto funziona come una normale richiesta di post e nessuna deserializzazione JSON è necessario sul lato server.

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

Mi ci sono volute ore per capire che mentre lavoravo con Angular e PHP. I dati dei post non sono andati a PHP in $ _POST

nel codice PHP fai quanto segue – Crea una variabile $ angular_post_params – Quindi effettua il seguente $angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));

ora puoi accedere ai tuoi parametri come fai da $ _POST

$angular_http_params["key"]

nel caso ti stavi chiedendo di javascript …. questo è quello che ho usato

  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"); }); });