Helpex - Trao đổi & giúp đỡ Đăng nhập
24

Tôi có mã đơn giản đó:

$http.get("/api/test")
    .success(function (data, status, headers, config) {
        console.log(data);
        return data;
    }).error(function (data, status, headers, config) {
        alert("error");
        return status;
});

Nó hoạt động tốt, nhưng hàm lỗi không bao giờ được gọi, ngay cả khi tôi trả về 404 (Không tìm thấy) từ máy chủ ... Trong trường hợp đó, nó gọi hàm 'thành công' với trạng thái = 404 ...

Đúng không?

Cảm ơn

Fiddler:

Request

GET http://localhost:41234/api/test HTTP/1.1
Host: localhost:41234
Connection: keep-alive
Accept: application/json, text/plain, */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko)    Chrome/25.0.1364.172 Safari/537.22
Referer: http://localhost:41234/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: ASP.NET_SessionId=bd1b3rib5j4beub0xbuhb1hm; FormsAuthentication=xxxxx

Response

HTTP/1.1 404 Not Found
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcUGVzc29hxvY2FyLkFwaVxhcGcg==?=
X-Powered-By: ASP.NET
Content-Length: 0
24 hữu ích 0 bình luận 44k xem chia sẻ
5

Vấn đề là máy chủ web của bạn, nó đang đặt độ dài nội dung thành 0, nghĩa là đó là giá trị hợp lệ như bạn có thể thấy trên đặc tả HTTP / 1.1 .

Ngoài ra, tôi đã làm một ví dụ trên JSFiddle hiển thị các ví dụ về lỗi và thành công. Xem tại đây .

Các tiêu đề từ ví dụ lỗi:

Yêu cầu:

GET /error/ HTTP/1.1
Host: fiddle.jshell.net
Connection: keep-alive
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like  Gecko) Chrome/26.0.1410.65 Safari/537.31
DNT: 1
Referer: http://fiddle.jshell.net/danielcsgomes/cAMc6/1/show/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: UTF-8,*;q=0.5
Cookie: csrftoken=4tNVNxC5v6BSq9yJCKkHlGFJBz3cClqd`

Phản ứng:

HTTP/1.1 404 NOT FOUND
Server: nginx/0.8.54
Date: Fri, 12 Apr 2013 00:38:07 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Cookie
Content-Encoding: gzip
5 hữu ích 2 bình luận chia sẻ
28

Tôi đã gặp vấn đề tương tự và thành thật mà nói, làm theo các gợi ý của bài đăng này đã đưa tôi đi sai hướng ... vì vậy, tôi chia sẻ trường hợp / giải pháp của mình để những người khác trong cùng hoàn cảnh của tôi có thể tiết kiệm thời gian.

Tôi đang sử dụng Angular.js 1.2.14 + WebApi 2. đây là phản hồi của tôi cho trạng thái NotFound:

Cache-Control:no-cache
Content-Length:0
Date:Sat, 15 Mar 2014 14:28:35 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcU3ZpbHVwcG9EaXNjaXR1clxhcGlcTWFnMTRcYXBpXGxlc3Nvblw4NA==?=

Như bạn có thể thấy, Nội dung-Chiều dài: 0, nhưng không sao.

Vấn đề của tôi là việc sử dụng không chính xác trình đánh chặn Angular.js, cụ thể là một cái gì đó như thế này:

responseError: function (result) {
                // check something 
                return result;
            }

trả về kết quả mà không đưa ra ngoại lệ hoặc từ chối các lời hứa ( như được viết trong tài liệu ) khiến Angular tin rằng tôi muốn chuyển đổi từ chối theo độ phân giải chính xác và sau đó, lệnh gọi lại thành công được gọi.

Tôi sửa mã của mình như sau:

responseError: function (result) {                    
                // check something 
                return $q.reject(result);
            }
28 hữu ích 1 bình luận chia sẻ
3

Nếu bạn đang sử dụng AngularJS phiên bản 1.1.1 trở lên ...

Thêm '.json' có hoạt động không ?:

$http.get("/api/test.json")
  .success(function (data, status, headers, config) {
      console.log(data);
      return data;
  }).error(function (data, status, headers, config) {
      alert("error");
      return status;
});

Nếu vậy, nó cũng có thể được khắc phục bằng:

myModule.config(['$httpProvider', function ($httpProvider) {
  $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
}]);

Xem này => Angular JS không thành công sau khi nâng cấp từ 1.1.0 lên 1.1.1

3 hữu ích 3 bình luận chia sẻ
2

Có thể hơi muộn nhưng ... Hiện tại, yêu cầu Angular $ http cung cấp cho bạn một tiền đề để bạn có thể thay đổi nó thành:

$http({
    method: "yourMethod",
    url: "yourUrl",
    data: {yourDataObj}
}).then(function (res) {     //first function "success"
    console.log(res.data);
}, function (err) {          //second function "error"
    console.log(err);
});
2 hữu ích 0 bình luận chia sẻ
0

Chúng tôi đã chuyển bài đăng đến một nhà máy, chúng tôi không thực sự quan tâm ở đây về việc kiểm tra nội dung $ http, chỉ là những gì nó thực hiện thành công hay lỗi:

factoryModule.factory('GiftFactory', function ($http, Settings) {
    var saveUrl = Settings.endpoints.saveUrl;

    return {
        createGift: function (data) {
            var gift = { gift: JSON.stringify(angular.toJson(data.gift)) };
            return $http.post(saveUrl, gift);
        }
    };
});

Chúng tôi gọi nó như thế này:

    $scope.submit = function () {
        $scope.submitting = true;
        GiftFactory.createGift($scope)
            .success(function () {
                $window.location = Giving.endpoints.indexUrl;
            }).error(function() {
                $scope.submitting = false;
                alert('an error occurred');
        });
    };

Chúng tôi kiểm tra nó như thế này:

describe('donation controller', function () {
var $scope, q, window, controller;

beforeEach(module('giving.donation'));
beforeEach(inject(function ($controller, $rootScope, $q) {
    $scope = $rootScope.$new();
    window = {};
    q = $q;
    giftFactory = {};
    controller = $controller('DonationController', { $scope: $scope, $window: window, GiftFactory: giftFactory });
}));

describe('submit', function () {
    var deferred;
    beforeEach(function () {
        deferred = q.defer();

        deferred.promise.success = function (fn) {
            deferred.promise.then(
                function (response) {
                    fn(response.data, response.status, response.headers);
                });
            return deferred.promise;
        };
        deferred.promise.error = function (fn) {
            deferred.promise.then(null,
                function (response) {
                    fn(response.data, response.status, response.headers);
                });
            return deferred.promise;
        };
    });

    it('should redirect on success', function () {
        //Arrange
        Giving = { endpoints: { indexUrl: "/testurl" } };

        giftFactory.createGift = function () {
            return deferred.promise;
        };

        //Act
        $scope.submit();

        deferred.resolve({});
        $scope.$apply();

        //Assert
        expect($scope.submitting).toBeTruthy();
        expect(window.location).toBe('/testurl');
    });

    it('should set submitting back to false on error', function () {
        //Arrange
        Giving = { endpoints: { indexUrl: "/testurl" } };

        giftFactory.createGift = function () {
            return deferred.promise;
        };

        //Act
        $scope.submit();

        deferred.reject({});
        $scope.$apply();

        //Assert
        expect($scope.submitting).toBeFalsy();
        expect(window.location).toBeUndefined();
    });
});

});
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ angularjs , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading