角JS:对于取消的请求设置HTTP状态代码(angular-js: Set HTTP status

2019-10-22 11:06发布

当取消像这样的HTTP请求:

$scope.runTest = function() {
    if (canceler) canceler.resolve();
    canceler = $q.defer();
    $http({
        method: 'GET',
        url: 'http://www.google.com/',
        timeout: canceler.promise
    })
    .success(function(data) {
        $scope.result.push({msg: "this won't be displayed on cancel"});
    })
    .error(function(data) {
        $scope.result.push({msg: "this will be displayed on cancel"});
    });
};

是否有可能作出取消HTTP请求有一个特定的HTTP代码,例如205? 它会导致HTTP拦截与HTTP状态0,这也用于超时或没有网络连接触发。 我希望能够在拦截这两个方案之间进行区分

谢谢!

Answer 1:

我结束了以下方法:

$scope.runTest = function() {

    if (canceler) {
        // Set non-zero status for http interceptors
        // Using 499, an nginx extension to flag cancelled http requests
        // Could be something else like a boolean, using status code for convenience
        canceler.promise.status = 499;

        // Cancel the request
        canceler.resolve();
    }

    canceler = $q.defer();
    $http({
        method: 'GET',
        url: 'http://www.google.com/',
        timeout: canceler.promise
    })
    .success(function(data) {
        // On sucesss
    })
    .error(function(data) {
        // On error
    });
};

在这里我只设置超时东西标志的要求是取消了,因为@Daniel席尔瓦建议。 然后在我的HTTP拦截器:

app.config(function($httpProvider) {

    $httpProvider.interceptors.push(function($q) {
        return {
            'responseError': function(response) {

                var statusCode = response.status;

                // Get status from timeout, if 0 and timeout present
                if (statusCode === 0 && response.config.timeout) {
                    statusCode = response.config.timeout.status;
                }

                // Ignore client request cancelled
                if (statusCode === 499) {
                    return response;
                }

                // Reject via $q, otherwise the error will pass as success
                return $q.reject(response);
            }
        };
    });
});


Answer 2:

你需要记住的是,角$ HTTP超时是一个“客户端”超时,尽管它有服务器超时同名。 当您配置的角度$ HTTP超时,你在说什么“我不会等到服务器超时”。 访问第三方API时,这可能是特别有用的,因为你不能配置超时设置。

这是HTTP状态0的原因没有HTTP 408响应,因为角取消请求,而不是等待服务器超时。

您可以使用$超时服务返回的承诺处理客户端超时

var myTimeout = $timeout(function () {
    console.log("Cannot wait you anymore!");
}, 1000); 

$http({
    method: 'GET',
    url: 'http://www.google.com/',
    timeout: myTimeout
})
.success(function (data) {
    $scope.result.push({ msg: "this won't be displayed on cancel" });
})
.error(function (data) {
    $scope.result.push({ msg: "this will be displayed on cancel" });
});


文章来源: angular-js: Set HTTP status code for cancelled requests