【问题标题】:AngularJS HTTP Post to PHPAngularJS HTTP Post 到 PHP
【发布时间】:2016-02-06 00:43:22
【问题描述】:

我正在使用$http 方法从angularjs 控制器将一些数据发布到php 页面,如下所示。

$scope.login = function(){
    var data = {
        'username' : $scope.username,
        'password' : $scope.password
    };
    $http.post('login.php', data).success(function(response){
        console.log(response);
    });
};

我知道我可以使用 php 检索这些数据:

$postdata = json_decode(file_get_contents('php://input'), true);

但我想知道angularjs 中是否有更好的方法,所以我可以使用php 中的简单$_POST 来检索数据。

jQuery 中,我们可以简单地使用$.post,而php$_POST 中可用。为什么angularjs 没那么简单。 当我们在angularjs 中执行$http post 请求时,有什么方法可以填充php$_POST。请帮忙。

【问题讨论】:

  • 这在服务中吗??
  • 我检查了你提到的帖子。但那篇文章没有解释如何填充$_POST
  • @abdulla 这是一个简单的控制器文件
  • 您需要将$httpProvider.defaults.transformRequest 覆盖为将data 序列化为标准URL 编码格式而不是JSON 的转换器。阅读一些示例的文档。这只是为您指明正确的方向,如果有人想通过各种方式将其发展为完整的答案,请这样做。

标签: php jquery angularjs post


【解决方案1】:

您需要将您的请求转换为php known 格式。
我使用jQuery$.param 方法来构建它。你可以自己写。

app.config(['$httpProvider', function($http) {  
    $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
    $http.defaults.transformRequest = function(data) {
            return $.param(data);
        };
    }]);

urlencoded 遵循简单格式:

username=Name&password=My%20Password

JSFiddle

【讨论】:

  • print_r($_POST)时得到一个空数组
  • 我为此添加了小提琴
  • 注意Content-Type 的大小写。一个已经存在,如果你写错了 - 两个标题将被发送。 HTTP 服务器选择其中之一(未定义行为)
  • @Adersh,成功了吗?还是有问题?
  • 我无法理解这种方法如何在 php 中接收数据。通过$_POST 我得到一个空数组。
【解决方案2】:

好吧,我只是在我的控制器类中使用它,所以我所有的帖子请求:使用 jQuery 的普通请求或通过角度的请求最终都在 $_post

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

玩得开心,

【讨论】:

  • 更正确地检查Content-type 标头,正如我在上面的评论中所写。可以肯定的是,该客户端发送 json。
  • @vp_arth,不一定,如果$_post 是空的,那么它来自角度,这里不需要更复杂。
  • 现在对我来说看起来更复杂了。 empty($_POST) 不正确而且很神奇。在其他情况下它可以为空。另外我们应该如何处理其他查询,例如PUTPATCH
  • @vp_arth OP 询问了 POST,对于其他情况,您可以使用 switch 语句。 $_post 是一个数组,所以我们可以随时使用 empty 函数检查它,为什么不正确??
【解决方案3】:

使用 jQuery $.param 方法让它工作。感谢 vp_arth 的回答。我刚刚添加了这个答案,因为它可能对某人有所帮助。如果只有一个请求需要它,则可以使用它。

$scope.login = function(){
    var data = {
        'username' : $scope.username,
        'password' : $scope.password
    };

    $http({
        url: "login.php",
        method: "POST",
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        data: $.param(data)
    }).success(function(response){
        console.log(response);
    });

};

【讨论】:

  • 只有一个请求时可以使用。如果您的项目中有多个帖子请求,我强烈建议您使用transformRequest。它使您的代码干净易读,例如$http.post(url, data)
  • 是的,..你是对的。我已接受并投票赞成您的答案:) 刚刚添加了此答案,因为它可能对某人有所帮助。
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2017-08-24
  • 1970-01-01
  • 2016-02-02
  • 2016-12-08
  • 2017-10-17
相关资源
最近更新 更多