2016-04-14 21 views
6

tôi đang cố gắng để tạo lại hành vi sau đây mà tôi thực hiện thành công bằng tên lửa đánh chặn 1.x góc và những lời hứa, trong một Ionic2 ứng dụng Angular2 dựa lỗi:Angular2: HTTP xử lý

  1. Intercept lỗi yêu cầu HTTP
  2. Nếu mã trạng thái là 401, thì

    a. thực hiện một yêu cầu khác để đăng ký khách hàng. Điều này sẽ cung cấp một số mã thông báo mà sau đó tôi có thể đính kèm vào mỗi yêu cầu.

    b. Thử lại yêu cầu orignal và cung cấp kết quả cho người gọi thông qua lời hứa/quan sát

  3. Nếu tình trạng lỗi là bất cứ điều gì khác hơn 401 chỉ để cho dòng chảy bình thường cho người gọi

NB: Quá trình đăng ký không cần bất kỳ sự can thiệp nào từ người dùng (không đăng nhập) nên tôi muốn nó hoàn toàn minh bạch cho người dùng. Tôi đăng ký một lần khi ứng dụng được tải lần đầu tiên, nhưng phiên cuối cùng sẽ hết hạn và tôi cần tự động đăng ký lại.

Đây là bản gốc kiễu góc 1 thực hiện (tôi chỉ bao gồm các responseError một phần của đánh chặn):

responseError : function(rejection){ 
    if(rejection.status == 401){ 
     $log.info('Intercepting unauthorized 401 response. Will try to re-register the session and retry the request.'); 

     var security = $injector.get('SecurityService'); 
     var $http = $injector.get('$http'); 

     return security.registerSession().then(function(){ 
      return $http(rejection.config); 
     }); 

    }else{ 
     return rejection; 
    } 
} 

Bây giờ, tôi đã quấn dịch vụ HTTP Angular2 và tôi có thể làm những việc đơn giản như thêm một tiêu đề cho mỗi yêu cầu. Tuy nhiên tôi đang đấu tranh để tái tạo các hành vi tương tự bằng cách sử dụng Angular2 và Observables.

nỗ lực của tôi cho đến nay, đây là phương pháp theo yêu cầu của wrapper HTTP của tôi rằng các dịch vụ của tôi sẽ gọi:

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 

    let req: Request = this.buildRequest(url, options); 

    this.beforeCall(req); 

    var observable = this.http 
     .request(req) 
     .retry(3) 
     .catch(res => { 
      debugger; 
      console.log("ERROR! " + res.status); 
      if(res.status == 401){ 
       this.logger.log('Unauthorized request. Trying to register the session and then retry the request.'); 
       return this.securityService.registerSession().subscribe(() => { 
        // What to do here so the client gets the result of the original request ?? 
       }); 
      } 
     }) 
     .do((res:Response) => { this.afterCall(req, res) }); 

    return observable; 
} 
+0

Trông giống như một phần của http://stackoverflow.com/questions/33941836/angular2-handling-http-response –

+1

@ Günter: Có liên quan nhưng không phải là IMO kép. Tôi muốn xử lý lỗi bên trong trình bao bọc và làm điều gì đó với nó, sau đó thử lại. Anh ấy muốn trả lại phản hồi lỗi cho người gọi. –

+0

Giải pháp này đã được triển khai chưa? Tôi đã cố gắng làm điều tương tự nhưng không thành công. Nó sẽ thực sự hữu ích nếu bạn có thể đăng giải pháp hoàn chỉnh. – Abhinandan

Trả lời

5

Bạn có thể thực hiện một lần nữa yêu cầu sau khi khởi tạo phiên sử dụng toán tử flatMap của quan sát:

var observable = this.http 
     .request(req) 
     .retry(3) 
     .catch(res => { 
      debugger; 
      console.log("ERROR! " + res.status); 
      if(res.status == 401){ 
       this.logger.log('Unauthorized request. Trying to register the session and then retry the request.'); 
       return this.securityService.registerSession().flatMap(() => { 
        return this.http.request(req); // <-------- 
       }); 
      } 
     }) 
     .do((res:Response) => { this.afterCall(req, res) }); 

    return observable; 
} 
+1

điều này có nghĩa là 'thử lại (3)' là gì? yêu cầu thực hiện 3 lần nếu thất bại một lần? –

+0

Tuyệt vời !!!! Cảm ơn ... 'retry (3)' đã làm việc – Romesh

Các vấn đề liên quan