【问题标题】:POST call in Safari using angularjs $http is not being called未调用使用 angularjs $http 在 Safari 中的 POST 调用
【发布时间】:2017-07-13 05:58:06
【问题描述】:

我有一个角度应用程序。我在使用 POST 调用和使用 $http 指令时遇到问题。在我的控制器中,我通过使用我所做的 Api 服务进行了两次调用:getMe() 和 and assignments(csv):

assignments: function(csv) {
    var deferred = $q.defer();
    $http({
      method: 'POST',
      url: '/api/numbers/assignments',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      data: $.param({
        skipBillables: false,
        assignments: csv,
      })
    }).success(function(data) {
      deferred.resolve(data);
    }).error(function(data) {
      deferred.reject(data);
    })
    return deferred.promise;
  },
  getMe: function() {
    return this.cachedGet("/users/me");
  },
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script>

这是控制器中的实际调用。我们向用户端点发出 GET 请求,然后在回调中发布到 assignments。

Api.getMe().then(function(data) {



}, function(error) {
  $window.location.reload();
}).finally(function() {
  var checkouttollfreenumber = '1' + $scope.savedTollFreeNumberCheckout.tfn;
  var assignObj = [{
    phoneNum: checkouttollfreenumber,
    email: owner.emailAddress,
    percent: 0,
  }];
  var csvFile = downloadCSV(assignObj);
  console.log(csvFile);
  Api.assignments(csvFile).then(function(data) {
    //do something
  })
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script>

它在 Chrome 和 Firefox 中正确执行,但在 Safari 中不正确。在 Safari 中,它调用 GET 请求到 http:applicationname.com/18885052939,useremail@email.com,percentageparameter。请求实际上是调用 POST 调用的序列化参数来赋值。

在 Chrome 中,我们有正确的行为。在用户/我的 GET 请求之后,我们使用 POST 数据参数点击http://local.appname.com:9000/api/numbers/assignments

不确定是什么导致了 Safari 中的错误,但想知道我哪里出错了。这是旧版本的 Angular (1.2.15)。

【问题讨论】:

  • Angular v1.2 的最新错误修复是 v1.2.32。试试那个版本,看看是否修复了任何与 Safari 相关的错误。
  • 谢谢@georgeawg 我会试一试的。
  • @georgeawg 试过了。这似乎不是问题的根源。

标签: angularjs ajax http asynchronous safari


【解决方案1】:

在 AngularJS v1.4 中,框架使 url 参数序列化程序可用作 $httpParamSerializer,以用于对仅支持内容类型 application/x-www-form-urlencoded 的 API 的 POST 请求。

function assignments(csv){
    promise = $http({
      method: 'POST',
      url: '/api/numbers/assignments',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      data: {
        skipBillables: false,
        assignments: csv,
      },
      transformRequest: $httpParamSerializer
    });
    return promise;
}

对于不接受 AngularJS 框架默认 application/json 的 API,应用程序程序员不再需要编写自己的序列化程序或为其序列化程序加载 jQuery。

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 2017-10-03
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多