문서의 선택한 두 판 사이의 차이를 보여줍니다.
| angular:httpclient [2019/03/02 10:04] – [Testing for errors] taekgu | angular:httpclient [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| - | ===== HttpClient ===== | + | ====== HttpClient |
| 관련 POST | 관련 POST | ||
| 줄 8: | 줄 8: | ||
| // | // | ||
| - | ==== Setup ==== | + | ===== Setup ===== |
| HttpClient를 사용하려면 먼저 Angular HttpClientModule을 가져와야합니다. 대부분의 앱은 루트 AppModule에서 그렇게합니다. | HttpClient를 사용하려면 먼저 Angular HttpClientModule을 가져와야합니다. 대부분의 앱은 루트 AppModule에서 그렇게합니다. | ||
| 줄 30: | 줄 30: | ||
| </ | </ | ||
| - | ==== JSON data 얻기 ==== | + | ===== JSON data 얻기 |
| subscribe를 통해서 request를 요구한다. | subscribe를 통해서 request를 요구한다. | ||
| <code javascript> | <code javascript> | ||
| 줄 41: | 줄 41: | ||
| service method는 Observable의 구성 데이터를 반환하기 때문에 component는 method의 return value을 구독합니다. subscribe callback은 데이터 필드를 구성 요소의 구성 객체로 복사합니다. 구성 객체는 표시를 위해 구성 요소 템플리트에서 데이터 바인딩됩니다. | service method는 Observable의 구성 데이터를 반환하기 때문에 component는 method의 return value을 구독합니다. subscribe callback은 데이터 필드를 구성 요소의 구성 객체로 복사합니다. 구성 객체는 표시를 위해 구성 요소 템플리트에서 데이터 바인딩됩니다. | ||
| - | === 왜 service를 쓰는가 === | + | ==== 왜 service를 쓰는가 |
| 이 예제는 너무 간단해서 // | 이 예제는 너무 간단해서 // | ||
| 줄 50: | 줄 50: | ||
| 그렇기 때문에 데이터 액세스를 별도의 서비스에 캡슐화하고 해당 서비스의 구성 요소에서 위임과 같은 단순한 경우에도 데이터 액세스를 데이터 액세스에서 분리하는 것이 가장 좋은 방법입니다. | 그렇기 때문에 데이터 액세스를 별도의 서비스에 캡슐화하고 해당 서비스의 구성 요소에서 위임과 같은 단순한 경우에도 데이터 액세스를 데이터 액세스에서 분리하는 것이 가장 좋은 방법입니다. | ||
| - | === Type-checking the response === | + | ==== Type-checking the response |
| 위의 subscribe 콜백은 데이터 값을 추출하기 위해 대괄호 표기법(bracket notation)을 필요로합니다. | 위의 subscribe 콜백은 데이터 값을 추출하기 위해 대괄호 표기법(bracket notation)을 필요로합니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 89: | 줄 89: | ||
| </ | </ | ||
| - | === Reading the full response === | + | ==== Reading the full response |
| 응답 본문은 필요한 모든 데이터를 반환하지 않습니다. 경우에 따라 서버는 특수 헤더 또는 상태 코드를 반환하여 응용 프로그램 워크 플로에서 중요한 특정 조건을 나타냅니다. | 응답 본문은 필요한 모든 데이터를 반환하지 않습니다. 경우에 따라 서버는 특수 헤더 또는 상태 코드를 반환하여 응용 프로그램 워크 플로에서 중요한 특정 조건을 나타냅니다. | ||
| 줄 119: | 줄 119: | ||
| </ | </ | ||
| 보는 것과같이, | 보는 것과같이, | ||
| - | ==== Error Handling ==== | + | ===== Error Handling |
| 서버에서 요청이 실패하거나 네트워크 연결 상태가 좋지 않아 서버에 도달하지 못하면 어떻게됩니까? | 서버에서 요청이 실패하거나 네트워크 연결 상태가 좋지 않아 서버에 도달하지 못하면 어떻게됩니까? | ||
| 줄 134: | 줄 134: | ||
| 데이터 액세스가 실패 할 경우 사용자에게 어떤 종류의 피드백을 제공하는 것이 좋습니다. 그러나 HttpClient가 반환 한 원시 오류 객체를 표시하는 것은 최선의 방법과 거리가 멀습니다. | 데이터 액세스가 실패 할 경우 사용자에게 어떤 종류의 피드백을 제공하는 것이 좋습니다. 그러나 HttpClient가 반환 한 원시 오류 객체를 표시하는 것은 최선의 방법과 거리가 멀습니다. | ||
| - | === Getting error details === | + | ==== Getting error details |
| 오류가 발생했음을 감지하는 것이 한 가지입니다. 그 오류를 해석하고 사용자에게 친숙한 응답을 작성하는 것은 좀 더 복잡합니다. | 오류가 발생했음을 감지하는 것이 한 가지입니다. 그 오류를 해석하고 사용자에게 친숙한 응답을 작성하는 것은 좀 더 복잡합니다. | ||
| 줄 175: | 줄 175: | ||
| } | } | ||
| </ | </ | ||
| - | === retry() === | + | ==== retry() |
| 때때로 오류는 일시적이며 다시 시도하면 자동으로 사라집니다. 예를 들어 네트워크 중단은 모바일 시나리오에서 흔히 발생하며 다시 시도하면 성공적인 결과를 얻을 수 있습니다. | 때때로 오류는 일시적이며 다시 시도하면 자동으로 사라집니다. 예를 들어 네트워크 중단은 모바일 시나리오에서 흔히 발생하며 다시 시도하면 성공적인 결과를 얻을 수 있습니다. | ||
| 줄 192: | 줄 192: | ||
| </ | </ | ||
| - | ==== Observables and operators ==== | + | ===== Observables and operators |
| 이 가이드의 이전 섹션에서는 catchError 및 retry와 같은 RxJS Observables 및 연산자에 대해 설명했습니다. 아래에서 계속 진행하면 RxJS 아티팩트가 더 많이 발생합니다. | 이 가이드의 이전 섹션에서는 catchError 및 retry와 같은 RxJS Observables 및 연산자에 대해 설명했습니다. 아래에서 계속 진행하면 RxJS 아티팩트가 더 많이 발생합니다. | ||
| 줄 206: | 줄 206: | ||
| </ | </ | ||
| - | ==== Requesting non-JSON data ==== | + | ===== Requesting non-JSON data ===== |
| 모든 API가 JSON 데이터를 반환하지는 않습니다. 이 다음 예제에서 DownloaderService 메서드는 서버에서 텍스트 파일을 읽고 파일 내용을 기록한 다음 Observable< | 모든 API가 JSON 데이터를 반환하지는 않습니다. 이 다음 예제에서 DownloaderService 메서드는 서버에서 텍스트 파일을 읽고 파일 내용을 기록한 다음 Observable< | ||
| <code javascript> | <code javascript> | ||
| 줄 234: | 줄 234: | ||
| </ | </ | ||
| - | ==== Sending data to the server ==== | + | ===== Sending data to the server |
| HttpClient는 서버에서 데이터를 가져 오는 것 외에도 변경 요청, 즉 PUT, POST 및 DELETE와 같은 다른 HTTP 메서드로 서버에 데이터를 보내는 요청을 지원합니다. | HttpClient는 서버에서 데이터를 가져 오는 것 외에도 변경 요청, 즉 PUT, POST 및 DELETE와 같은 다른 HTTP 메서드로 서버에 데이터를 보내는 요청을 지원합니다. | ||
| 줄 241: | 줄 241: | ||
| 다음 섹션에서는 샘플 HeroesService의 메소드를 발췌합니다. | 다음 섹션에서는 샘플 HeroesService의 메소드를 발췌합니다. | ||
| - | === Adding headers === | + | ==== Adding headers |
| 많은 서버는 저장 조작을 위해 여분의 헤더가 필요합니다. 예를 들어 요청 본문의 MIME 형식을 명시 적으로 선언하기 위해 " | 많은 서버는 저장 조작을 위해 여분의 헤더가 필요합니다. 예를 들어 요청 본문의 MIME 형식을 명시 적으로 선언하기 위해 " | ||
| 줄 255: | 줄 255: | ||
| }; | }; | ||
| </ | </ | ||
| - | === Making a POST request === | + | ==== Making a POST request |
| 애플리케이션은 종종 서버에 데이터를 POST합니다. 양식을 제출할 때 POST됩니다. 다음 예제에서 HeroesService는 영웅을 데이터베이스에 추가 할 때 게시합니다. | 애플리케이션은 종종 서버에 데이터를 POST합니다. 양식을 제출할 때 POST됩니다. 다음 예제에서 HeroesService는 영웅을 데이터베이스에 추가 할 때 게시합니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 282: | 줄 282: | ||
| 서버가 새로 추가 된 영웅으로 성공적으로 응답하면 구성 요소는 영웅을 표시된 영웅 목록에 추가합니다. | 서버가 새로 추가 된 영웅으로 성공적으로 응답하면 구성 요소는 영웅을 표시된 영웅 목록에 추가합니다. | ||
| - | === Making a DELETE request === | + | ==== Making a DELETE request |
| 이 애플리케이션은 요청 URL에 영웅의 ID를 전달하여 HttpClient.delete 메소드로 영웅을 삭제합니다. | 이 애플리케이션은 요청 URL에 영웅의 ID를 전달하여 HttpClient.delete 메소드로 영웅을 삭제합니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 307: | 줄 307: | ||
| </ | </ | ||
| - | == 항상 구독하십시오! == | + | === 항상 구독하십시오! |
| HttpClient 메서드는 해당 메서드에서 반환 한 관찰 가능 항목에 대해 subscribe ()를 호출 할 때까지 HTTP 요청을 시작하지 않습니다. 이는 모든 HttpClient 메소드에 적용됩니다. | HttpClient 메서드는 해당 메서드에서 반환 한 관찰 가능 항목에 대해 subscribe ()를 호출 할 때까지 HTTP 요청을 시작하지 않습니다. 이는 모든 HttpClient 메소드에 적용됩니다. | ||
| - | > | + | > |
| HttpClient 메서드에서 반환 된 모든 관찰 가능 항목은 의도적으로 차갑습니다. HTTP 요청의 실행이 지연되므로 실제로 발생하기 전에 관찰 및 관찰 작업을 tap 및 catchError와 같은 추가 작업으로 확장 할 수 있습니다. | HttpClient 메서드에서 반환 된 모든 관찰 가능 항목은 의도적으로 차갑습니다. HTTP 요청의 실행이 지연되므로 실제로 발생하기 전에 관찰 및 관찰 작업을 tap 및 catchError와 같은 추가 작업으로 확장 할 수 있습니다. | ||
| 줄 329: | 줄 329: | ||
| </ | </ | ||
| - | === Making a PUT request === | + | ==== Making a PUT request |
| 앱이 리소스를 업데이트 된 데이터로 완전히 대체하기 위해 PUT 요청을 보냅니다. 다음 HeroesService 예제는 POST 예제와 같습니다. | 앱이 리소스를 업데이트 된 데이터로 완전히 대체하기 위해 PUT 요청을 보냅니다. 다음 HeroesService 예제는 POST 예제와 같습니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 342: | 줄 342: | ||
| 위에서 설명한 이유로 호출자 (이 경우 HeroesComponent.update())는 요청을 시작하기 위해 HttpClient.put()에서 반환 된 관찰 가능 객체에 subscribe()해야합니다. | 위에서 설명한 이유로 호출자 (이 경우 HeroesComponent.update())는 요청을 시작하기 위해 HttpClient.put()에서 반환 된 관찰 가능 객체에 subscribe()해야합니다. | ||
| - | ==== Advanced usage ==== | + | ===== Advanced usage ===== |
| 우리는 **@angular/ | 우리는 **@angular/ | ||
| - | === Configuring the request === | + | ==== Configuring the request |
| 보내는 요청의 다른 측면은 HttpClient 메서드의 마지막 인수로 전달 된 옵션 개체를 통해 구성 할 수 있습니다. | 보내는 요청의 다른 측면은 HttpClient 메서드의 마지막 인수로 전달 된 옵션 개체를 통해 구성 할 수 있습니다. | ||
| 이전에 HeroesService는 options 객체 (httpOptions)를 save 메소드에 전달하여 기본 헤더를 설정했다. 더 많은 일을 할 수 있습니다. | 이전에 HeroesService는 options 객체 (httpOptions)를 save 메소드에 전달하여 기본 헤더를 설정했다. 더 많은 일을 할 수 있습니다. | ||
| - | == Update headers == | + | === Update headers |
| HttpHeaders 클래스의 인스턴스는 변경 불가능하기 때문에 이전 옵션 객체에서 기존 헤더를 직접 수정할 수 없습니다. | HttpHeaders 클래스의 인스턴스는 변경 불가능하기 때문에 이전 옵션 객체에서 기존 헤더를 직접 수정할 수 없습니다. | ||
| 줄 359: | 줄 359: | ||
| httpOptions.headers.set(' | httpOptions.headers.set(' | ||
| </ | </ | ||
| - | == URL Parameters == | + | === URL Parameters |
| URL 검색 매개 변수를 추가하는 것도 비슷한 방식으로 작동합니다. 다음은 검색 단어가 포함 된 영웅을 검색하는 searchHeroes 메소드입니다. | URL 검색 매개 변수를 추가하는 것도 비슷한 방식으로 작동합니다. 다음은 검색 단어가 포함 된 영웅을 검색하는 searchHeroes 메소드입니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 379: | 줄 379: | ||
| HttpParams는 변경할 수 없으므로 set() 메서드를 사용하여 옵션을 업데이트해야합니다. | HttpParams는 변경할 수 없으므로 set() 메서드를 사용하여 옵션을 업데이트해야합니다. | ||
| - | === Debouncing requests === | + | ==== Debouncing requests |
| 이 샘플에는 npm 패키지 검색 기능이 포함되어 있습니다. | 이 샘플에는 npm 패키지 검색 기능이 포함되어 있습니다. | ||
| 줄 430: | 줄 430: | ||
| 검색 값은 새 값이고 사용자가 입력을 중지 한 경우에만 서비스에 도달합니다. | 검색 값은 새 값이고 사용자가 입력을 중지 한 경우에만 서비스에 도달합니다. | ||
| > withRefresh 옵션은 아래에 설명되어 있습니다. | > withRefresh 옵션은 아래에 설명되어 있습니다. | ||
| - | == switchMap() == | + | === switchMap() |
| switchMap () 연산자에는 세 가지 중요한 특징이 있습니다. | switchMap () 연산자에는 세 가지 중요한 특징이 있습니다. | ||
| 줄 440: | 줄 440: | ||
| > 이 디 바운싱 로직을 재사용 할 생각이라면 유틸리티 함수 또는 PackageSearchService 자체로 옮기는 것을 고려하십시오. | > 이 디 바운싱 로직을 재사용 할 생각이라면 유틸리티 함수 또는 PackageSearchService 자체로 옮기는 것을 고려하십시오. | ||
| - | === Intercepting requests and responses === | + | ==== Intercepting requests and responses |
| //HTTP Interception// | //HTTP Interception// | ||
| 줄 447: | 줄 447: | ||
| interceptor가 없으면 개발자는 각 HttpClient 메서드 호출에 대해 이러한 작업을 // | interceptor가 없으면 개발자는 각 HttpClient 메서드 호출에 대해 이러한 작업을 // | ||
| - | == Write an interceptor == | + | === Write an interceptor |
| 인터셉터를 구현하려면 HttpInterceptor 인터페이스의 intercept() 메소드를 구현하는 클래스를 선언하십시오. | 인터셉터를 구현하려면 HttpInterceptor 인터페이스의 intercept() 메소드를 구현하는 클래스를 선언하십시오. | ||
| 줄 482: | 줄 482: | ||
| 이 no-op 인터셉터는 단순히 원래 요청으로 next.handle()을 호출하고 일을하지 않고 observable을 반환합니다. | 이 no-op 인터셉터는 단순히 원래 요청으로 next.handle()을 호출하고 일을하지 않고 observable을 반환합니다. | ||
| - | == The next object == | + | === The next object |
| 다음 객체는 인터셉터 체인의 다음 인터셉터를 나타냅니다. 마지막으로 체인에있는 요청은 서버에 요청을 보내고 서버의 응답을받는 HttpClient 백엔드 처리기입니다. | 다음 객체는 인터셉터 체인의 다음 인터셉터를 나타냅니다. 마지막으로 체인에있는 요청은 서버에 요청을 보내고 서버의 응답을받는 HttpClient 백엔드 처리기입니다. | ||
| 줄 490: | 줄 490: | ||
| 이것은 Express.js와 같은 프레임 워크에서 흔히 볼 수있는 미들웨어 패턴입니다. | 이것은 Express.js와 같은 프레임 워크에서 흔히 볼 수있는 미들웨어 패턴입니다. | ||
| - | == Provide the interceptor == | + | === Provide the interceptor |
| NoopInterceptor는 Angular의 DI (Dependency Injection) 시스템으로 관리되는 서비스입니다. 다른 서비스와 마찬가지로, | NoopInterceptor는 Angular의 DI (Dependency Injection) 시스템으로 관리되는 서비스입니다. 다른 서비스와 마찬가지로, | ||
| 줄 528: | 줄 528: | ||
| > 전체 샘플 코드에는 더 많은 인터셉터가 있습니다. | > 전체 샘플 코드에는 더 많은 인터셉터가 있습니다. | ||
| - | == Interceptor order == | + | === Interceptor order === |
| Angular는 사용자가 제공 한 순서대로 인터셉터를 적용합니다. 인터셉터 A, B, C를 제공하면 요청은 A-> B-> C로 흐르고 응답은 C-> B-> A로 흐르게됩니다. | Angular는 사용자가 제공 한 순서대로 인터셉터를 적용합니다. 인터셉터 A, B, C를 제공하면 요청은 A-> B-> C로 흐르고 응답은 C-> B-> A로 흐르게됩니다. | ||
| 줄 534: | 줄 534: | ||
| 주문을 변경하거나 나중에 인터셉터를 제거 할 수 없습니다. 인터셉터를 동적으로 활성화 및 비활성화해야하는 경우 인터셉터 자체에 해당 기능을 구현해야합니다. | 주문을 변경하거나 나중에 인터셉터를 제거 할 수 없습니다. 인터셉터를 동적으로 활성화 및 비활성화해야하는 경우 인터셉터 자체에 해당 기능을 구현해야합니다. | ||
| - | == HttpEvents == | + | === HttpEvents |
| 대부분의 HttpClient 메소드가 수행하는 것처럼 intercept() 및 handle() 메서드가 HttpResponse< | 대부분의 HttpClient 메소드가 수행하는 것처럼 intercept() 및 handle() 메서드가 HttpResponse< | ||
| 줄 545: | 줄 545: | ||
| 그러나 next.handle()의 응답을 검사하고 수정하는 인터셉터는 이러한 모든 이벤트를 볼 수 있습니다. 인터셉터는 그렇지 않은 다른 이유가없는 한 손대지 않은 모든 이벤트를 반환해야합니다. | 그러나 next.handle()의 응답을 검사하고 수정하는 인터셉터는 이러한 모든 이벤트를 볼 수 있습니다. 인터셉터는 그렇지 않은 다른 이유가없는 한 손대지 않은 모든 이벤트를 반환해야합니다. | ||
| - | == Immutability == | + | === Immutability |
| 인터셉터는 요청과 응답을 변경시킬 수 있지만 HttpRequest 및 HttpResponse 인스턴스 속성은 읽기 전용이므로 거의 변경되지 않습니다. | 인터셉터는 요청과 응답을 변경시킬 수 있지만 HttpRequest 및 HttpResponse 인스턴스 속성은 읽기 전용이므로 거의 변경되지 않습니다. | ||
| 줄 566: | 줄 566: | ||
| </ | </ | ||
| clone() 메서드의 해시 인수를 사용하면 요청의 특정 속성을 변경하면서 다른 속성을 복사 할 수 있습니다. | clone() 메서드의 해시 인수를 사용하면 요청의 특정 속성을 변경하면서 다른 속성을 복사 할 수 있습니다. | ||
| - | == The request body == | + | === The request body === |
| readonly 할당 보호는 딥 업데이트를 방지 할 수 없으며 특히 요청 본문 개체의 속성을 수정하지 못하게 할 수 없습니다. | readonly 할당 보호는 딥 업데이트를 방지 할 수 없으며 특히 요청 본문 개체의 속성을 수정하지 못하게 할 수 없습니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 582: | 줄 582: | ||
| </ | </ | ||
| - | == Clearing the request body == | + | === Clearing the request body === |
| 경우에 따라 요청 본문을 대체하지 않고 삭제해야하는 경우도 있습니다. 복제 된 요청 본문을 undefined로 설정하면 Angular는 본문을 그대로 두려고한다고 가정합니다. 그것은 당신이 원하는 것이 아닙니다. 복제 된 요청 본문을 null로 설정하면 Angular는 요청 본문을 지우려는 의도가 있음을 알고 있습니다. | 경우에 따라 요청 본문을 대체하지 않고 삭제해야하는 경우도 있습니다. 복제 된 요청 본문을 undefined로 설정하면 Angular는 본문을 그대로 두려고한다고 가정합니다. 그것은 당신이 원하는 것이 아닙니다. 복제 된 요청 본문을 null로 설정하면 Angular는 요청 본문을 지우려는 의도가 있음을 알고 있습니다. | ||
| 줄 592: | 줄 592: | ||
| </ | </ | ||
| - | == Set default headers == | + | === Set default headers |
| 앱은 종종 인터셉터를 사용하여 발신 요청에 기본 헤더를 설정합니다. | 앱은 종종 인터셉터를 사용하여 발신 요청에 기본 헤더를 설정합니다. | ||
| 줄 631: | 줄 631: | ||
| - XSRF 보호 | - XSRF 보호 | ||
| - | == Logging == | + | === Logging |
| 인터셉터는 요청과 응답을 함께 처리 할 수 있기 때문에 시간과 같은 작업을 수행하고 전체 HTTP 작업을 기록 할 수 있습니다. | 인터셉터는 요청과 응답을 함께 처리 할 수 있기 때문에 시간과 같은 작업을 수행하고 전체 HTTP 작업을 기록 할 수 있습니다. | ||
| 줄 673: | 줄 673: | ||
| 탭하거나 파이널 라이즈하지 않으면 발신자에게 반환 된 관찰 가능한 스트림의 값을 터치하지 않습니다. | 탭하거나 파이널 라이즈하지 않으면 발신자에게 반환 된 관찰 가능한 스트림의 값을 터치하지 않습니다. | ||
| - | == Caching == | + | === Caching |
| 인터셉터는 next.handle()에 전달하지 않고 스스로 요청을 처리 할 수 있습니다. | 인터셉터는 next.handle()에 전달하지 않고 스스로 요청을 처리 할 수 있습니다. | ||
| 줄 734: | 줄 734: | ||
| PackageSearchService와 같은 데이터 서비스는 HttpClient 요청 중 일부가 실제로 캐시 된 응답을 반환한다는 것을 알지 못합니다. | PackageSearchService와 같은 데이터 서비스는 HttpClient 요청 중 일부가 실제로 캐시 된 응답을 반환한다는 것을 알지 못합니다. | ||
| - | == Return a multi-valued Observable == | + | === Return a multi-valued Observable |
| HttpClient.get () 메서드는 일반적으로 데이터 또는 오류를 내보내는 관찰 가능 항목을 반환합니다. 어떤 사람들은 그것을 "한 번에 끝낸" | HttpClient.get () 메서드는 일반적으로 데이터 또는 오류를 내보내는 관찰 가능 항목을 반환합니다. 어떤 사람들은 그것을 "한 번에 끝낸" | ||
| 줄 761: | 줄 761: | ||
| 캐시 된 값이 있으면 코드는 캐시 된 응답을 result$로 파이프하여 두 번 내보내는 재구성된 관찰 가능 항목을 생성하고 캐시된 응답을 먼저 (그리고 바로) 응답 한 다음 나중에 서버에서 응답합니다. 구독자는 // | 캐시 된 값이 있으면 코드는 캐시 된 응답을 result$로 파이프하여 두 번 내보내는 재구성된 관찰 가능 항목을 생성하고 캐시된 응답을 먼저 (그리고 바로) 응답 한 다음 나중에 서버에서 응답합니다. 구독자는 // | ||
| - | === Listening to progress events === | + | ==== Listening to progress events |
| 때때로 응용 프로그램은 많은 양의 데이터를 전송하며 이러한 전송에는 오랜 시간이 걸릴 수 있습니다. 파일 업로드가 전형적인 예입니다. 이러한 전송 진행 상황에 대한 피드백을 제공하여 사용자에게 더 나은 경험을 제공하십시오. | 때때로 응용 프로그램은 많은 양의 데이터를 전송하며 이러한 전송에는 오랜 시간이 걸릴 수 있습니다. 파일 업로드가 전형적인 예입니다. 이러한 전송 진행 상황에 대한 피드백을 제공하여 사용자에게 더 나은 경험을 제공하십시오. | ||
| 줄 808: | 줄 808: | ||
| > 이 가이드의 샘플 앱에는 업로드 된 파일을 허용하는 서버가 없습니다. app/ | > 이 가이드의 샘플 앱에는 업로드 된 파일을 허용하는 서버가 없습니다. app/ | ||
| - | ==== Security: XSRF Protection ==== | + | ===== Security: XSRF Protection |
| XSRF (Cross-Site Request Forgery)는 공격자가 인증 된 사용자를 속여 웹 사이트에서 무의식적으로 실행하는 공격 기법입니다. HttpClient는 XSRF 공격을 막는 데 사용되는 일반적인 메커니즘을 지원합니다. HTTP 요청을 수행 할 때 인터셉터는 기본적으로 XSRF-TOKEN에 의해 쿠키에서 토큰을 읽고 HTTP 헤더 인 X-XSRF-TOKEN으로 설정합니다. 도메인에서 실행되는 코드 만 쿠키를 읽을 수 있기 때문에 백엔드는 HTTP 요청이 공격자가 아닌 클라이언트 응용 프로그램에서 온 것임을 확신 할 수 있습니다. | XSRF (Cross-Site Request Forgery)는 공격자가 인증 된 사용자를 속여 웹 사이트에서 무의식적으로 실행하는 공격 기법입니다. HttpClient는 XSRF 공격을 막는 데 사용되는 일반적인 메커니즘을 지원합니다. HTTP 요청을 수행 할 때 인터셉터는 기본적으로 XSRF-TOKEN에 의해 쿠키에서 토큰을 읽고 HTTP 헤더 인 X-XSRF-TOKEN으로 설정합니다. 도메인에서 실행되는 코드 만 쿠키를 읽을 수 있기 때문에 백엔드는 HTTP 요청이 공격자가 아닌 클라이언트 응용 프로그램에서 온 것임을 확신 할 수 있습니다. | ||
| 줄 819: | 줄 819: | ||
| > // | > // | ||
| - | === Configuring custom cookie/ | + | ==== Configuring custom cookie/ |
| 백엔드 서비스가 XSRF 토큰 쿠키 또는 헤더에 대해 다른 이름을 사용하는 경우 HttpClientXsrfModule.withOptions ()를 사용하여 기본값을 대체하십시오. | 백엔드 서비스가 XSRF 토큰 쿠키 또는 헤더에 대해 다른 이름을 사용하는 경우 HttpClientXsrfModule.withOptions ()를 사용하여 기본값을 대체하십시오. | ||
| <code javascript> | <code javascript> | ||
| 줄 831: | 줄 831: | ||
| </ | </ | ||
| - | ==== Testing HTTP requests ==== | + | ===== Testing HTTP requests |
| 외부 종속성과 마찬가지로 HTTP 백엔드가 조롱 받아 테스트가 원격 서버와의 상호 작용을 시뮬레이션 할 수 있어야합니다. @ angular / common / http / testing 라이브러리는 그러한 조롱을 쉽게 설정합니다. | 외부 종속성과 마찬가지로 HTTP 백엔드가 조롱 받아 테스트가 원격 서버와의 상호 작용을 시뮬레이션 할 수 있어야합니다. @ angular / common / http / testing 라이브러리는 그러한 조롱을 쉽게 설정합니다. | ||
| - | === Mocking philosophy === | + | ==== Mocking philosophy |
| Angular의 HTTP 테스트 라이브러리는 앱이 코드를 실행하고 요청을 먼저 처리하는 테스트 패턴을 위해 설계되었습니다. | Angular의 HTTP 테스트 라이브러리는 앱이 코드를 실행하고 요청을 먼저 처리하는 테스트 패턴을 위해 설계되었습니다. | ||
| 줄 845: | 줄 845: | ||
| > 이 가이드에서 설명하는 테스트는 src/ | > 이 가이드에서 설명하는 테스트는 src/ | ||
| - | === Setup === | + | ==== Setup ==== |
| HttpClient에 대한 호출을 테스트하려면 테스트에 필요한 다른 기호와 함께 HttpClientTestingModule 및 조롱 컨트롤러 HttpTestingController를 가져옵니다. | HttpClient에 대한 호출을 테스트하려면 테스트에 필요한 다른 기호와 함께 HttpClientTestingModule 및 조롱 컨트롤러 HttpTestingController를 가져옵니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 878: | 줄 878: | ||
| 또한이 설정은 TestBed.get ()을 호출하여 테스트 중에 참조 될 수 있도록 HttpClient 서비스 및 조롱 컨트롤러를 주입합니다. | 또한이 설정은 TestBed.get ()을 호출하여 테스트 중에 참조 될 수 있도록 HttpClient 서비스 및 조롱 컨트롤러를 주입합니다. | ||
| - | === Expecting and answering requests === | + | ==== Expecting and answering requests |
| 이제 GET 요청이 발생할 것으로 예상되는 테스트를 작성하고 모의 응답을 제공 할 수 있습니다. | 이제 GET 요청이 발생할 것으로 예상되는 테스트를 작성하고 모의 응답을 제공 할 수 있습니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 915: | 줄 915: | ||
| </ | </ | ||
| - | == Custom request expectations == | + | === Custom request expectations |
| URL로 일치하는 것만으로 충분하지 않으면 자체 매칭 기능을 구현할 수 있습니다. 예를 들어, 인증 헤더가있는 발신 요청을 찾을 수 있습니다. | URL로 일치하는 것만으로 충분하지 않으면 자체 매칭 기능을 구현할 수 있습니다. 예를 들어, 인증 헤더가있는 발신 요청을 찾을 수 있습니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 925: | 줄 925: | ||
| 이전 expectOne()과 마찬가지로 0 또는 2 개 이상의 요청이이 조건을 충족하면 테스트가 실패합니다. | 이전 expectOne()과 마찬가지로 0 또는 2 개 이상의 요청이이 조건을 충족하면 테스트가 실패합니다. | ||
| - | == Handling more than one request == | + | === Handling more than one request |
| 테스트에서 중복 요청에 응답해야하는 경우 expectOne () 대신 match () API를 사용하십시오. 동일한 인수를 사용하지만 일치하는 요청의 배열을 반환합니다. 일단 반환되면 이러한 요청은 나중에 일치하는 것으로부터 제거되며 사용자는이를 플러시하고 확인해야합니다. | 테스트에서 중복 요청에 응답해야하는 경우 expectOne () 대신 match () API를 사용하십시오. 동일한 인수를 사용하지만 일치하는 요청의 배열을 반환합니다. 일단 반환되면 이러한 요청은 나중에 일치하는 것으로부터 제거되며 사용자는이를 플러시하고 확인해야합니다. | ||
| <code javascript> | <code javascript> | ||
| 줄 938: | 줄 938: | ||
| </ | </ | ||
| - | === Testing for errors === | + | ==== Testing for errors |
| 실패한 HTTP 요청에 대해 앱의 방어를 테스트해야합니다. | 실패한 HTTP 요청에 대해 앱의 방어를 테스트해야합니다. | ||