2017-02-22 81 views
0

我有一个角度应用程序。我遇到POST调用并使用$ http指令。在我的控制器使我通过API服务的消费,我提出两个电话:)getMe(和和任务(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("https://stackoverflow.com/users/me"); 
 
    },
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script>

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

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,[email protected],percentageparameter。该请求实际上是将POST调用的序列化参数调用到分配。

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

不知道是什么导致了Safari中的错误,但想知道我出错的地方。这是angular(1.2.15)的旧版本。

+0

Angular v1.2的最新缺陷修复程序是v1.2.32。尝试该版本以查看是否有任何与Safari相关的bug已修复。 – georgeawg

+0

谢谢@georgeawg我会试试看。 –

+0

@georgeawg试过了。它似乎不是问题的根源。 –

回答

0

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

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; 
} 

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