PHP后端接收不到AngularJs中$http.post发送的数据的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014273681/article/details/78732380
1、问题描述
用angularJS中的$http服务碰到了一个问题:运用$http.post方法向后台传递数据时,后台的php页面获取不到data参数传过来的值。

不论是这种姿势:
$http.post( "1.php", { id: 1 }).success(function (data) {
                console.log(data);
           });

还是这种姿势:

$http({
     method: 'POST',
     url: '1.php',
     data: { id: 1 }
 }).success(function (data) {
     console.log(data);
 });

 
 
后台php中的$_POST或$_REQUEST都无法获取到data中的值:

<?php
    echo json_encode($_POST);
?>

输出为一个空数组。为了测试php本身是不是真的获取不到值,我就写了个表单测试下:
<form action="1.php" method="post">
    <input type="text" name="tid">
    <input type="submit" value="submit">
</form>
输出结果为:{"tid":"2"},也就是说表单里的值是可以获取的,但是用ajax发送的数据获取不了!

那么表单数据和ajax发送的post数据之间有什么差异呢?于是我悄悄瞄一眼请求头...

打开firebug发现其实传成功了,折腾了好半天才发现,它只不过传输的格式与普通的传输格式比如jQuery里的$.post()方法传输的格式不同,$http.post()是以json格式传输,而$.post()是以表单参数形式传输,而php的$.POST[]是期待以后者的形式接收前台传输过来的数据的,因此读取不到json传的数据。 问题一下子就出来了!表单发送的文本类型是表单类型,而angular的ajax默认发送的则是json数据。 2、解决
  I、.简单粗暴的直接改成$.post()方法,这样后台不用作任何修改,但是网上一些比较有经验的网友称这样可能违背使用angular的初衷。
  II、引用JQuery,使用JQuery的$.param()方法序列化参数后传递
           
    $http({
        method  : 'POST',
        url: 'process.php',
        data: $.param($scope.formData), //序列化参数 
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' } )
     })

 
 
III、 使用file_get_contents("php://input")获取再处理
      $input = file_get_contents("php://input",true);
       echo $input;
    VI、修改Angular的$httpProvider的默认处理(参考:http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax


猜你喜欢

转载自blog.csdn.net/u014273681/article/details/78732380