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响应,但是,返回的数据是说email
和password
是未定义的。 这是我所有的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;
或者,如果您严重依赖$_POST
function,则可以形成一个查询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"); }); });