기본 및 특정 요청 시간 초과
일반적으로 기본 시간 제한(예: 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
'programing' 카테고리의 다른 글
오류: 접두사가 llvm인 ABI의 NDK 도구 체인 폴더에서 도구 체인을 찾을 수 없습니다. (0) | 2023.08.29 |
---|---|
중첩 예외는 java.dll입니다.잘못된 인수예외:관리되지 않는 유형: 클래스 (0) | 2023.08.29 |
Android SQLite에서 Maria로 여러 데이터 동기화DB (0) | 2023.08.29 |
두 SQL Server 데이터베이스를 비교하는 무료 도구는 무엇입니까? (0) | 2023.08.29 |
MySQL: #1075 - 잘못된 테이블 정의; 자동 증분과 다른 키? (0) | 2023.08.29 |