无法使用AngularJS post方法获取正确的数据

时间:2016-03-26 07:08:45

标签: php jquery angularjs codeigniter http-post

这是我第一次与AngulerJS合作。我试图将POST数据发送到服务器。

AngularJS代码

 var app = angular.module("myApp", []);
var BASE_URL = "http://localhost/project/api/Data/";

var GET_DATA = BASE_URL+"get_data";
console.log(GET_DATA);
app.controller('myCtrl', function($scope, $http) {
var inputs = { "user_id": "3"};
var config = {
              headers : {
                  'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
              }
          }
$http.post(GET_DATA , inputs, config)
          .success(function (response, status, headers, config) {
              $scope.content = response.error;
              $scope.statuscode = response.status;
              $scope.statustext = response.statusInfo;
              console.log(response);    
          })
          .error(function (data, status, header, config) {
              $scope.ResponseDetails = "Data: " + data +
                  "<hr />status: " + status +
                  "<hr />headers: " + header +
                  "<hr />config: " + config;
          });

});

此代码将数据发布到服务器,但使用有线格式。以下是我的print_r($_POST);结果:

Array
(
    [{"user_id":"3"}] => 
    [0] => 
)

这是错误的结果,我期待像

这样的东西
Array
(
    user_id => 3
)

注意:我在服务器端使用CodeIgniter框架。

2 个答案:

答案 0 :(得分:1)

您可以在json发送您的帖子数据:

$http.post(GET_DATA , {"user_id": "3"})
      .success(function (response, status, headers, config) {
          $scope.content = response.error;
          $scope.statuscode = response.status;
          $scope.statustext = response.statusInfo;
          console.log(response);    
       })
      .error(function (data, status, header, config) {
          $scope.ResponseDetails = "Data: " + data +
             "<hr />status: " + status +
             "<hr />headers: " + header +
             "<hr />config: " + config;
       });
});

在服务器端,你可以得到这样的帖子数据:

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

当请求内容类型为application / x-www-form-urlencoded`时,您必须以urlencoded格式对帖子正文中的数据进行编码。这应该是这样的:

var inputs = 'student_id=3';

答案 1 :(得分:1)

虽然写下旧问题的答案不是正确的做法,但我想发布这个答案,以便其他人可以随时提供帮助。

首先,要了解发生这种事情的原因。原因是,AngularJS不会自动序列化传递给POST请求的数据(参数)。因此,我们必须使用 <camelContext id="camel" trace="true" xmlns="http://camel.apache.org/schema/spring"> <route id="demo-rest-route"> <from uri="activemq:queue:demo.rest"/> <!--<setBody inheritErrorHandler="true" id="setBody2"> <simple>name=${body}</simple> </setBody>--> <setHeader headerName="Content-Type" inheritErrorHandler="true" id="setHeader3"> <constant>Content-Type: application/json;</constant> </setHeader> <setHeader headerName="Exchange.HTTP_METHOD"> <constant>POST</constant> </setHeader> <toD uri="http://localhost:8181/cxf/person" /> </route> </camelContext> 序列化数据,该数据可用作AngularJS服务。此外,发布数据的默认内容类型是application / json。因此,我们需要将post请求的Content-type标头覆盖到application / x-www-form-urlencoded,以便通过$ _POST访问发布的值。

现在在角度中也提供了$httpParamSerializerJQLike服务,但差异$httpParamSerializer是包含另一个对象的对象,因此如果使用前者,则内部对象将不会被序列化,即所有嵌套对象都赢了不能使用$httpParamSerializerJQLike序列化,但$httpParamSerializer不是这种情况。

您可以在此处查看差异:AngularJS $httpParamSerializer service DOC

现在,我们可以通过在角度JS中使用$httpParamSerializerJQLike服务,以json编码和解码php中的数据,而不是$httpParamSerializerJQLike编码和解码数据:

$http({
        url: myUrl,   //post your url here
        method: 'POST',
        data: $httpParamSerializerJQLike({ 'user_id': '3'}),
       headers: {
       'Content-Type': 'application/x-www-form-urlencoded'
       }
      });

在codeigniter中,您可以按正常语法(即$this->input->post('user_id');

)获取发布的数据

有关更多信息......您可以参考上面提到的链接......

希望它可以帮到你......