【问题标题】:Error -1 send parameters using $http.post angular错误 -1 使用 $http.post 角度发送参数
【发布时间】:2016-02-10 18:42:03
【问题描述】:

当你在 Angular 中使用 $ http.post 提交参数时遇到问题。

我认为这是某种错误本身对 angular 知之甚少,因为在 jquery 中工作正常。

请求 jquery'javascript

var user = $('#usuariotxt').val();
var pass = $('#passwordtxt').val();

var login= {
              Usuario : user,
              Password : pass
       };

       $.ajax({

          type: 'POST',
          url:  'http://190.109.185.138/Apipedro/api/login',
          data: login,
          datatype: 'json'

        }).done(function(data) {

                console.log(data);
        });

请求 Angular-Javascript

var app;

app = angular.module('AppUPC',[]);

app.controller('Formulario',['$scope', '$http', function ($scope, $http){

    $scope.login = function(){

        var login = {
            Usuario: $scope.usuariotxt,
            Password: $scope.passwordtxt
        };

        console.log(login);

        var url, method;
        url = 'http://190.109.185.138/Apipedro/api/login';
        method = 'POST';


         $http.post("http://190.109.185.138/Apipedro/api/login", {}, 
                    {params: {Usuario:$scope.usuariotxt, Password:$scope.passwordtxt} 
         }).success(function (data, status, headers, config) {
                $scope.persons = data;
                console.log($scope.persons);

        }).error(function (data, status, headers, config) {
                $scope.status = status;
                console.log($scope.status);
        });

     };

}]);

我也用过很多其他的形式,包括最常见的

 $http({

            url: url,
            method: method,            
            data: login,
            headers :{'Content-Type':'application/json'}

         })

我遇到的错误如下

【问题讨论】:

  • 您的 API 是否真的期望请求正文中有 JSON 有效负载?您的 jQuery 示例将发送 Usuario=user&Password=pass,而 Angular 版本将发送 {"Usuario":"user","Password":"pass"}。听起来您的 API 设置为处理 CORS 飞行前(即 OPTIONS)请求,并且标头 Content-Type: application/json 使其成为非简单请求,从而触发飞行前请求
  • 奇怪的是它适用于 jquery。似乎服务器拒绝了该请求。在任何请求之前,浏览器发送一个选项类型的请求来检查请求方法是否被服务器允许。在这种情况下,服务器以拒绝响应。
  • @Dvir 这一点都不奇怪。 jQuery POST 请求是一个简单请求,因此不会触发飞行前OPTIONS 请求。

标签: javascript jquery angularjs


【解决方案1】:

简短回答:如果您想发送与 jQuery 示例相同的数据,请使用此

app.controller('Formulario', ['$scope', '$http', '$httpParamSerializer', function ($scope, $http, $httpParamSerializer) {

    // snip

    $http.post(url, $httpParamSerializer(login), {
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
    }).then(function success(response) {
        $scope.persons = response.data;
    }, function error(response) {
        $scope.status = response.status;
    });
}]);

这是因为jQuery默认发送POST数据作为x-www-form-urlencoded字符串,即

Usuario=dfvides&Password=dfvids

使用上面的代码,Angular 会向 jQuery 发送一个相同的请求。

默认情况下,Angular 以 JSON 格式发送 POST 数据,并将 Content-Type 标头设置为 application/json,即

{"Usuario":"dfvides","Password":"dfvids"}

您的 API 是否设置为处理 JSON 负载?


您的 Angular 版本触发 pre-flight OPTIONS 请求(似乎您的 API 没有能够处理)的原因是标头 Content-Type: application/json 发出请求 non-simple.. .

一个简单的跨站点请求是:

  • 仅使用GETHEADPOST。如果使用POST向服务器发送数据,则通过HTTP POST请求发送给服务器的数据的Content-Typeapplication/x-www-form-urlencodedmultipart/form-data或@987654339之一@。
  • 不使用 HTTP 请求设置自定义标头(例如 X-Modified 等)

【讨论】:

  • 感谢您的信息。与 app/json 相比,def 接受 x-www 的原因是什么?
  • 非常感谢,非常感谢您的帮助,工作完美,再次感谢,您知道任何解释角度的教程都可以很好地开始。
  • @Dvir 缺乏远见是我的猜测。即使添加 Authorization 标头也会导致 CORS 请求变得不简单,这是一个巨大的痛苦
  • @PedroMiguelPimientaMorales 在 Angular 指南/文档以及他们的示例 PhoneCat 应用程序中提供了大量有用的信息
猜你喜欢
  • 2018-04-21
  • 2021-02-21
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2021-10-02
  • 2019-07-08
  • 2013-10-15
相关资源
最近更新 更多