在使用AngularJS $http.post()的时候,PHP如果通过$_POST来获取值,那么它获取到的将会是空值。而如果是用jquery来进行post传递,却不会这个问题。这是为什么呢?这是因为两者的post对header的处理有所不同。jQuery会把作为JSON对象的myData序列化,而AngularJS不会,所以PHP无法接受到这个值。而解决这个问题的方式有三种:
第一种:引入jquery,以此代替AngularJS。(不推荐)
第二种:在服务器端(PHP)通过 $params = json_decode(file_get_contents('php://input'),true); 获取参数,需要一个一个改,效率低下,后期维护问题也大。(不推荐)
第三种:修改Angular的$httpProvider的默认处理方式,具体操作如下:
1 var app = angular.module('myApp', []);
//主要是添加以下红色字体代码 2 app.config(function($httpProvider){ 3 $httpProvider.defaults.transformRequest=function(obj){ 4 var str=[]; 5 for(var p in obj){ 6 str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p])); 7 } 8 return str.join("&"); 9 }; 10 $httpProvider.defaults.headers.post={ 11 'Content-Type':'application/x-www-form-urlencoded' 12 } 13 14 }) 15 app.controller('myController',function($scope,$http){ 16 var data={name:123,mess:321} 17 $http({ 18 url:'1.php', 19 method:'POST', 20 data:{ 21 'name':'tom', 22 'work':'boss' 23 } 24 }).success(function(data){ 25 console.log(data) 26 }).error(function(){ 27 console.log('error') 28 }) 29 30 $.ajax({ 31 url:'1.php', 32 type:'post' 33 }) 34 35 }) 36 angular.bootstrap(document.documentElement,['myApp'])
也可以在$http.post()中修改$httpProvider,具体操作如下:
1 var app = angular.module('myApp', []); 2 app.controller('myController',function($scope,$http){ 3 var data={name:123,mess:321} 4 $http({ 5 url:'1.php', 6 method:'POST', 7 data:{ 8 'name':'tom', 9 'work':'boss' 10 }, 11 headers:{'Content-Type':'application/x-www-form-urlencoded'}, 12 transformRequest:function(obj){ 13 var str=[]; 14 for(var p in obj){ 15 str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p])); 16 } 17 return str.join("&"); 18 } 19 }).success(function(data){ 20 console.log(data) 21 }).error(function(){ 22 console.log('error') 23 }) 24 25 $.ajax({ 26 url:'1.php', 27 type:'post' 28 }) 29 30 }) 31 angular.bootstrap(document.documentElement,['myApp'])
这样子就可以解决PHP无法通过$_POST接受到值得问题了。