【问题标题】:$http returns error when response is 304 (Not Modified) in angularjs当 angularjs 中的响应为 304(未修改)时,$http 返回错误
【发布时间】:2014-12-09 17:29:10
【问题描述】:

我正在使用 angularjs $http 向 asp net web api 发出请求。服务器上的 web api 通过 ETags 管理缓存。如果我的响应状态码是 304,那么它会进入错误函数而不是成功。我不明白angularjs这种奇怪行为的原因是什么。下面是我的代码

function getEmployeesPartial(pageIndex, pageSize) {
        var deferred = $q.defer();
        var uri = config.remoteServiceName + 'odata/Employees?$select=EmployeeId,FirstName,LastName,Email,Designation/Name&$top=' + pageSize + '&$skip=' + (pageIndex * pageSize) + '&$inlinecount=allpages' + '&$expand=Designation';
        var authData = common.getAuthData();
        var authHeaderValue = "Bearer " + authData.token;
        var etagHeaderValue = angular.empty;
        if (common.etag !=angular.empty) {
            etagHeaderValue = common.etag;
        }
        $http.get(uri, { headers: { 'Authorization': authHeaderValue,'If-None-Match':etagHeaderValue } }).success(function (response, status, headers, httpconfig) {
            // alert(headers('Etag'));
            common.etag = headers('Etag');
           deferred.resolve(response);
        }).error(function (err, status, headers, httpconfig) {
            if (status === 500) {
                deferred.reject(err['odata.error'].innererror.message);
            }
            deferred.resolve();

        });

        return deferred.promise;
    }

有什么想法吗?

【问题讨论】:

标签: angularjs


【解决方案1】:

我们通过实现 HTTP 拦截器并让拦截器解析状态 304 而不是拒绝来解决问题。

// register the interceptor as a service
$provide.factory('myHttpInterceptor', function ($q, dependency1, dependency2) {
    return {

        'responseError': function (rejection) {
            if (rejection.status === 304)  return $q.resolve(rejection);

            return $q.reject(rejection);
        }
    };
});

【讨论】:

    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2016-12-04
    • 2017-11-17
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多