HttpClient is an evolution of the existing Angular HTTP API, which exists alongside of it in a separate package, @angular/common/http. This structure ensures that existing codebases can slowly migrate to the new API. The new API improves significantly on the ergonomics and features of the legacy API. A partial list of new features includes: * Typed, synchronous response body access, including support for JSON body types * JSON is an assumed default and no longer needs to be explicitly parsed * Interceptors allow middleware logic to be inserted into the pipeline * Immutable request/response objects * Progress events for both request upload and response download * Post-request verification & flush based testing framework
		
			
				
	
	
		
			89 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google Inc. All Rights Reserved.JsonpCallbackContext
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| import 'rxjs/add/operator/map';
 | |
| 
 | |
| import {Injector} from '@angular/core';
 | |
| import {TestBed} from '@angular/core/testing';
 | |
| import {Observable} from 'rxjs/Observable';
 | |
| 
 | |
| import {HttpHandler} from '../src/backend';
 | |
| import {HttpClient} from '../src/client';
 | |
| import {HTTP_INTERCEPTORS, HttpInterceptor} from '../src/interceptor';
 | |
| import {HttpRequest} from '../src/request';
 | |
| import {HttpEvent, HttpResponse} from '../src/response';
 | |
| import {HttpTestingController} from '../testing/src/api';
 | |
| import {HttpClientTestingModule} from '../testing/src/module';
 | |
| import {TestRequest} from '../testing/src/request';
 | |
| 
 | |
| class TestInterceptor implements HttpInterceptor {
 | |
|   constructor(private value: string) {}
 | |
| 
 | |
|   intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {
 | |
|     const existing = req.headers.get('Intercepted');
 | |
|     const next = !!existing ? existing + ',' + this.value : this.value;
 | |
|     req = req.clone({setHeaders: {'Intercepted': next}});
 | |
|     return delegate.handle(req).map(event => {
 | |
|       if (event instanceof HttpResponse) {
 | |
|         const existing = event.headers.get('Intercepted');
 | |
|         const next = !!existing ? existing + ',' + this.value : this.value;
 | |
|         return event.clone({headers: event.headers.set('Intercepted', next)});
 | |
|       }
 | |
|       return event;
 | |
|     });
 | |
|   }
 | |
| }
 | |
| 
 | |
| class InterceptorA extends TestInterceptor {
 | |
|   constructor() { super('A'); }
 | |
| }
 | |
| 
 | |
| class InterceptorB extends TestInterceptor {
 | |
|   constructor() { super('B'); }
 | |
| }
 | |
| 
 | |
| export function main() {
 | |
|   describe('HttpClientModule', () => {
 | |
|     let injector: Injector;
 | |
|     beforeEach(() => {
 | |
|       injector = TestBed.configureTestingModule({
 | |
|         imports: [HttpClientTestingModule],
 | |
|         providers: [
 | |
|           {provide: HTTP_INTERCEPTORS, useClass: InterceptorA, multi: true},
 | |
|           {provide: HTTP_INTERCEPTORS, useClass: InterceptorB, multi: true},
 | |
|         ],
 | |
|       });
 | |
|     });
 | |
|     it('initializes HttpClient properly', (done: DoneFn) => {
 | |
|       injector.get(HttpClient).get('/test', {responseType: 'text'}).subscribe(value => {
 | |
|         expect(value).toBe('ok!');
 | |
|         done();
 | |
|       });
 | |
|       injector.get(HttpTestingController).expectOne('/test').flush('ok!');
 | |
|     });
 | |
|     it('intercepts outbound responses in the order in which interceptors were bound',
 | |
|        (done: DoneFn) => {
 | |
|          injector.get(HttpClient)
 | |
|              .get('/test', {observe: 'response', responseType: 'text'})
 | |
|              .subscribe(value => done());
 | |
|          const req = injector.get(HttpTestingController).expectOne('/test') as TestRequest;
 | |
|          expect(req.request.headers.get('Intercepted')).toEqual('A,B');
 | |
|          req.flush('ok!');
 | |
|        });
 | |
|     it('intercepts inbound responses in the right (reverse binding) order', (done: DoneFn) => {
 | |
|       injector.get(HttpClient)
 | |
|           .get('/test', {observe: 'response', responseType: 'text'})
 | |
|           .subscribe(value => {
 | |
|             expect(value.headers.get('Intercepted')).toEqual('B,A');
 | |
|             done();
 | |
|           });
 | |
|       injector.get(HttpTestingController).expectOne('/test').flush('ok!');
 | |
|     });
 | |
|   });
 | |
| }
 |