programing

기본 및 특정 요청 시간 초과

mailnote 2023. 8. 29. 20:48
반응형

기본 및 특정 요청 시간 초과

일반적으로 기본 시간 제한(예: 30초)은 모든 요청에 적용되고 특정한 더 긴 요청(예: 600초)에 대해 재정의될 수 있습니다.

기본 시간 제한을 지정할 수 있는 좋은 방법은 없습니다.Http제가 알기로는 서비스입니다.

이에 접근하는 방법은 무엇입니까?HttpClient서비스?특정 요청에 대해 재정의될 수 있는 모든 발신 요청에 대한 기본 시간 제한을 정의하는 방법은 무엇입니까?

연장하지 않은 것으로 보입니다.HttpClientModule클래스, 인터셉터가 각 요청과 통신할 수 있는 유일한 예상 방법은 다음과 같습니다.params그리고.headers물건들.

시간 초과 값은 스칼라이므로 인터셉터에 사용자 지정 헤더로 안전하게 제공할 수 있으며, 여기서 RxJS를 통해 적용해야 하는 기본 시간 초과인지 특정 시간 초과인지 결정할 수 있습니다.timeout연산자:

import { Inject, Injectable, InjectionToken } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { timeout } from 'rxjs/operators';

export const DEFAULT_TIMEOUT = new InjectionToken<number>('defaultTimeout');

@Injectable()
export class TimeoutInterceptor implements HttpInterceptor {
  constructor(@Inject(DEFAULT_TIMEOUT) protected defaultTimeout: number) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const timeoutValue = req.headers.get('timeout') || this.defaultTimeout;
    const timeoutValueNumeric = Number(timeoutValue);

    return next.handle(req).pipe(timeout(timeoutValueNumeric));
  }
}

이는 앱 모듈에서 다음과 같이 구성할 수 있습니다.

providers: [
  [{ provide: HTTP_INTERCEPTORS, useClass: TimeoutInterceptor, multi: true }],
  [{ provide: DEFAULT_TIMEOUT, useValue: 30000 }]
],

그런 다음 사용자 정의를 사용하여 요청이 수행됩니다.timeout머리말

http.get('/your/url/here', { headers: new HttpHeaders({ timeout: `${20000}` }) });

헤더는 문자열이어야 하므로 시간 초과 값을 먼저 문자열로 변환해야 합니다.

여기 데모가 있습니다.

크레딧은 @RahulSingh와 @Jota에게 전달됩니다.인터셉트를 사용하는 아이디어를 제안하기 위한 톨레도.timeout.

다른 답변과 함께 개발 컴퓨터에서 프록시 구성을 사용하는 경우 프록시의 기본 시간 제한은 120초(2분)입니다.더 긴 요청의 경우 구성에서 더 높은 값을 정의해야 합니다. 그렇지 않으면 이러한 응답이 작동하지 않습니다.

{
  "/api": {
    "target": "http://localhost:3000",
    "secure": false,
    "timeout": 360000
  }
}

다음과 같이 기본 시간 초과 값을 사용하여 글로벌 인터셉터를 생성할 수 있습니다.

import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest} from '@angular/common/http';

@Injectable()
export class AngularInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).timeout(30000, Observable.throw("Request timed out"));
    // 30000 (30s) would be the global default for example
  }
}

그런 다음 루트 모듈의 공급자 배열에 이 주입 가능 파일을 등록해야 합니다.

까다로운 부분은 특정 요청에 대한 기본 시간(증가/감소)을 재정의하는 것입니다.현재로서는 어떻게 해결해야 할지 모르겠습니다.

새로운 HttpClient를 사용하면 다음과 같은 것을 시도할 수 있습니다.

@Injectable()
export class AngularInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).timeout(5000).do(event => {}, err => { // timeout of 5000 ms
        if(err instanceof HttpErrorResponse){
            console.log("Error Caught By Interceptor");
            //Observable.throw(err);
        }
    });
  }
}

에 시간 초과 추가next.handle(req)전해지는 것입니다.

AppModule에 등록하는 것은 다음과 같이

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        HttpClientModule
    ],
    providers: [
        [ { provide: HTTP_INTERCEPTORS, useClass: 
              AngularInterceptor, multi: true } ]
    ],
    bootstrap: [AppComponent]
})
export class AppModule {
}

언급URL : https://stackoverflow.com/questions/45938931/default-and-specific-request-timeout

반응형