Angular HTTP发布到PHP和未定义

我有一个标签ng-submit="login()

这个函数在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'); }); } } 

我从PHP文件得到了200 OK响应,但是,返回的数据是说emailpassword是未定义的。 这是我所有的PHP

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

任何想法为什么我得到未定义的POST值?

编辑

我想指出,因为这似乎是一个受欢迎的问题(但它是旧的) .success.error已被弃用,你应该使用。然后.then @詹姆斯Gentes在评论指出

angularjs .post()默认Content-type头到application/json 。 你重写这个来传递表单编码的数据,但是你并没有改变你的data值来传递一个合适的查询string,所以PHP没有像你期望的那样填充$_POST

我的build议是只使用application/json的默认angularjs设置作为头,读取PHP中的原始input,然后反序列化JSON。

这可以在PHP中实现,如下所示:

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

或者,如果您严重依赖$_POSTfunction,则可以形成一个查询string,例如email=someemail@email.com&password=somepassword并将其作为数据发送。 确保这个查询string是URL编码的。 如果手动构build(而不是像使用jQuery.serialize() ),Javascript的encodeURIComponent()应该为你做的伎俩。

我在服务器端,在我的init文件开始时,就像一个魅力,你不必在angular度或现有的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”]。 很好用。

这样,如果一个经过身份validation的用户连接一个类似jQuery的库,发送默认的Content-Type:application / x-www-form-urlencoded或者Content-Type:application / json的post数据,那么API将无误地响应使API更开发友好一点。

希望这可以帮助。

Angular 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); ?> 

由于angular度行为,在PHP服务器上没有正常发布行为的直接方法,所以你必须在json对象中进行pipe理。

因为PHP本身并不接受JSON的'application/json'一种方法是从angular度更新你的头文件和参数,这样你的api就可以直接使用这些数据。

首先 ,参数化您的数据:

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

然后 ,将以下内容添加到您的$http

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

如果您的所有请求都转到PHP,则参数可以在configuration中全局设置,如下所示:

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

您需要反序列化您的表单数据,然后将其作为第二个parameter passing给.post()。 你可以使用jQuery的$ .param(data)方法实现这一点。 然后你可以在服务器端引用它,像$ .POST ['email'];

这是最好的解决scheme(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)传递参数,那么所有东西都像普通的post请求一样工作,没有JSON反序列化需要在服务器端。

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

我花了几个小时才明白,在Angular和PHP的工作。 发布数据不会在$ _POST的PHP中

在PHP代码中执行以下操作。 – 创build一个variables$ 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"); }); });