Slide 1

Slide 1 text

A close look to Angular's new HttpClient Manfred Steyer SOFTWAREarchitekt.at

Slide 2

Slide 2 text

About me … • Manfred Steyer • Angular Workshops and Consultancy • SOFTWAREarchitekt.at • Google Developer Expert (GDE) Page ▪ 2 Manfred Steyer

Slide 3

Slide 3 text

In the old days, everything was better ;-)

Slide 4

Slide 4 text

Just a few examples …

Slide 5

Slide 5 text

Http in Angular Http (Service) • Angular 2+ • Most Common Use Cases (80:20 principle) • Experimental • Deprecated with 5.0 HttpClient • Angular 4.3 • A lot of additional features • Full comfort we know from $http

Slide 6

Slide 6 text

Contents • Short overview of Basics • Custom Data Formats (Binary, Text) • Progress Information • Interceptors for Extensions • Token-based Security

Slide 7

Slide 7 text

DEMO

Slide 8

Slide 8 text

angular-crud

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Basics

Slide 11

Slide 11 text

HttpClient HttpClientModule and HttpClient from @angular/common/http let url = 'http://www.angular.at/api/hotel'; let headers = new HttpHeaders() .set('Accept', 'application/json'); let params = new HttpParams() .set('city', this.city); this .http .get(url, { headers, params }) .subscribe( hotels => console.debug('hotels', hotels), err => console.error('err', err) );

Slide 12

Slide 12 text

Getting the full HttpResponse save(entity: HotelBooking): Observable { let url = […] let headers = […] return this.http .post(url, entity, {headers, observe: 'response'}) […] }

Slide 13

Slide 13 text

Getting the full HttpResponse save(entity: HotelBooking): Observable { let url = […] let headers = […] return this.http .post(url, entity, {headers, observe: 'response'}) .pipe( map((response: HttpResponse) => { console.debug('status', response.status); console.debug('body', response.body); return response.headers.get('Location'); })); }

Slide 14

Slide 14 text

Testing

Slide 15

Slide 15 text

Main Idea: Mock the HttpBackend HttpClientTestingModule Your Code Test HttpClient HttpBackend Server MockBackend

Slide 16

Slide 16 text

Testing it('can load hotels by city', () => { let service: HotelService = TestBed.get(HotelService); let ctrl: HttpTestingController = TestBed.get(HttpTestingController); […] });

Slide 17

Slide 17 text

Testing it('can load hotels by city', () => { let service: HotelService = TestBed.get(HotelService); let ctrl: HttpTestingController = TestBed.get(HttpTestingController); service.find({ city: 'Graz' }).subscribe( hotels => expect(hotels.length).toBe(2), err => fail(err) ); […] });

Slide 18

Slide 18 text

Testing it('can load hotels by city', () => { let service: HotelService = TestBed.get(HotelService); let ctrl: HttpTestingController = TestBed.get(HttpTestingController); service.find({ city: 'Graz' }).subscribe( hotels => expect(hotels.length).toBe(2), err => fail(err) ); let req = ctrl.expectOne('/hotel?city=Graz'); expect(req.request.method).toBe('GET'); […] });

Slide 19

Slide 19 text

Testing it('can load hotels by city', () => { let service: HotelService = TestBed.get(HotelService); let ctrl: HttpTestingController = TestBed.get(HttpTestingController); service.find({ city: 'Graz' }).subscribe( hotels => expect(hotels.length).toBe(2), err => fail(err) ); let req = ctrl.expectOne('/hotel?city=Graz'); expect(req.request.method).toBe('GET'); req.flush([{id: 1, name: 'Hotel Mama'}, {id: 2, name: 'Budget Hotel'}]); ctrl.verify(); });

Slide 20

Slide 20 text

Custom Data Formats (Text and Binary)

Slide 21

Slide 21 text

Using XML findById(id: string): Observable { […] return this.http .get(url, { headers, params, responseType: 'text'}) […] }

Slide 22

Slide 22 text

Using XML findById(id: string): Observable { […] return this.http .get(url, { headers, params, responseType: 'text'}) .pipe( switchMap(xmlString => { let observableFactory = bindCallback(parseString); return observableFactory(xmlString, parserOptions); }), map(js => js[1].hotelBooking) ); } import { parseString } from 'xml2js';

Slide 23

Slide 23 text

DEMO

Slide 24

Slide 24 text

Interceptors

Slide 25

Slide 25 text

Idea • Providing a hook • Modify requests and responses globally • Including Headers, e. g. for Auth. • Parsing Data Formats, like XML • Error Handling • Caching • …

Slide 26

Slide 26 text

Chain of Responsibility Logic (HttpRequest) Interceptor Interceptor Request Response

Slide 27

Slide 27 text

DEMO Sending Access Token for Auth Global Error Handler for Auth

Slide 28

Slide 28 text

Conclusion observe: response, events, … responseType: text, blob, … Interceptor Chain The Dark Knight: Best Movie ever!

Slide 29

Slide 29 text

Contact und Downloads [mail] [email protected] [blog] SOFTWAREarchitekt.at [twitter] ManfredSteyer