如何使用与 angular2 http 服务的保持连接

Posted

技术标签:

【中文标题】如何使用与 angular2 http 服务的保持连接【英文标题】:how to use keep alive connection with angular2 http service 【发布时间】:2018-03-21 22:24:25 【问题描述】:

我制作了一个 Angular 应用程序,它每两秒发出一次 http GET 请求以更新仪表板。但我经常收到 HTTP 错误 429(请求过多)。

我在 Firefox 开发者工具中看到请求是“保持活动状态”,时间为 5 秒,所以我认为每个调用都是打开与服务器的连接而不是重用它

如何告诉 Angular 重用连接?或者如何避免429?只有 3 或 4 个并发客户端。

相关代码如下:

ngOnInit() 
    this.interval = Observable.interval(environment.dashboard_refresh_rate).subscribe(x => 
        this.getLockersFromService();
    );
    this.getLockersFromService();


ngOnDestroy() 
    this.interval.unsubscribe();


getLockersFromService() 
    this.http.get('/dashboard').subscribe(
        data => 
            this.showDashboard(data);
        ,
        (err: HttpErrorResponse) => 
            this.showErrorResponse(err);
        
    );

【问题讨论】:

听起来像是 websockets 的案例developer.mozilla.org/en-US/docs/Web/API/WebSockets_API 是的@jbrown,但我的后端在 Laravel (php) 中。我认为在 PHP 中实现 websocket 很复杂。我不认为我可以拥有一个长寿的 php 进程。 laravel.com/docs/5.5/broadcasting 【参考方案1】:

这是我使用的一个简单的过期实现。

它有一个会话并将会话发送到后端(每 30 秒)。如果弹出成功消息,logoutTimer 会增加 15 分钟。如果日期高于 logoutTimer 那么它将自动注销。

localStorage 用于,如果您在主页上再次打开它,您的会话可以通过 timeFithTeen 重新激活。

 constructor(private router: Router, private soap: SoapRequest)   //soap is your rest 
        if (localStorage.getItem('logoutTimer') === null) 
            this.timeFithTeen();
           
    



 ngOnInit() 
        Observable.timer(2000, 30000).subscribe(t => 
            let date = new Date();
            this.soap.keepAlive().then((response: any) => 
                localStorage.removeItem('logoutTimer');
                this.timeFithTeen();
            ), ((error: any) => 
                console.log(error);
            );
            if (date >= new Date(localStorage.getItem('logoutTimer'))) 
                localStorage.removeItem('sessionExpired');
                localStorage.setItem('sessionExpired', 'Session expired');
                this.router.navigateByUrl('/login');
            
        );
    
        private timeFithTeen() 
        let logoutTimer = new Date();
        logoutTimer.setMinutes(logoutTimer.getMinutes() + 15);
        localStorage.setItem('logoutTimer', logoutTimer.toString());
    

【讨论】:

以上是关于如何使用与 angular2 http 服务的保持连接的主要内容,如果未能解决你的问题,请参考以下文章

Angular2路由-路由更改时保持组件状态[重复]

如何将 ExpressJS 服务器与 Angular2 集成

Ionic2,Angular2:如何在使用 http get 进行 REST API 服务调用时避免 CORS 问题?

如何使用http在angular2中发出请求?

如何在HTTP客户端与服务器端之间保持状态(转)

angular2-img-cropper 不保持实际图像的大小