Angular:$ http.post()未调用

时间:2016-06-27 08:20:49

标签: angularjs post

我使用$ http将数据发布到服务器。

在发出POST请求之前,有两个OPTIONS requestMethod调用。

但是,有时不会发出POST请求。

当我在返回此呼叫时更新html时,页面会挂起。

 $http({
       url: scope.Settings.url,
               method: "POST",
                data:data,
                withCredentials: true
            }).then(function (data, status, headers, config) {
                setBusyState(false);
                scope.rModel = scope.search;
                scope.Results = data.data;
            }, function (data, status, headers, config) {
                scope.Results = [];
                setBusyState(false);
            });

编辑:这不会永远发生。只有几次。

这似乎只发生在Chrome中,而在IE中则很好

2 个答案:

答案 0 :(得分:1)

这是AngularJS的一个已知问题,它会缓存后续的http请求,所以如果你有多个http请求排成一行,你有时会遇到一些调用实际上没有。我主要看到这个积极缓存的问题IE。

要解决此问题,您需要应用某种全局设置,以防止http请求被缓存。以角度为单位的理想位置是$httpProvider

基本上,您使用适当的值设置不同的标头参数。

来自app.config的相关代码

appConfig.config(['$httpProvider', function ($httpProvider) {       
    $httpProvider.defaults.cache = false;
    //initialize get if not there
    if (!$httpProvider.defaults.headers.get) {
        $httpProvider.defaults.headers.get = {};
    }
    //disable IE ajax request caching
    $httpProvider.defaults.headers.get['If-Modified-Since'] = <set a time>;
    $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
    $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}
]);

答案 1 :(得分:0)

chrome中有什么角度,它会产生OPTIONS请求。

这些飞行前OPTIONS请求是在发出实际请求之前询问实际请求权限的一种方式。

因此,作为一种解决方法,在请求中添加标题可以解决问题。

$http({
    url: scope.Settings.url,
    method: "POST",
    data: data,
    headers: {
        'Content-Type': 'application/json'
    },
    withCredentials: true
}).then(function(data, status, headers, config) {
    setBusyState(false);
    scope.rModel = scope.search;
    scope.Results = data.data;
}, function(data, status, headers, config) {
    scope.Results = [];
    setBusyState(false);
});