92 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
|  | // #docregion
 | ||
|  | import 'dart:async'; | ||
|  | import 'dart:convert'; | ||
|  | 
 | ||
|  | import 'package:angular2/core.dart'; | ||
|  | import 'package:http/http.dart'; | ||
|  | 
 | ||
|  | import 'hero.dart'; | ||
|  | 
 | ||
|  | @Injectable() | ||
|  | class HeroService { | ||
|  |   // #docregion post
 | ||
|  |   static final _headers = {'Content-Type': 'application/json'}; | ||
|  |   // #enddocregion post
 | ||
|  |   // #docregion getHeroes
 | ||
|  |   static const _heroesUrl = 'app/heroes'; // URL to web API
 | ||
|  | 
 | ||
|  |   final Client _http; | ||
|  | 
 | ||
|  |   HeroService(this._http); | ||
|  | 
 | ||
|  |   Future<List<Hero>> getHeroes() async { | ||
|  |     try { | ||
|  |       final response = await _http.get(_heroesUrl); | ||
|  |       final heroes = _extractData(response) | ||
|  |           .map((value) => new Hero.fromJson(value)) | ||
|  |           .toList(); | ||
|  |       return heroes; | ||
|  |       // #docregion catch
 | ||
|  |     } catch (e) { | ||
|  |       throw _handleError(e); | ||
|  |     } | ||
|  |     // #enddocregion catch
 | ||
|  |   } | ||
|  | 
 | ||
|  |   // #docregion extract-data
 | ||
|  |   dynamic _extractData(Response resp) => JSON.decode(resp.body)['data']; | ||
|  |   // #enddocregion extract-data, getHeroes
 | ||
|  | 
 | ||
|  |   Future<Hero> getHero(int id) async => | ||
|  |       (await getHeroes()).firstWhere((hero) => hero.id == id); | ||
|  | 
 | ||
|  |   // #docregion save
 | ||
|  |   Future<Hero> save(dynamic heroOrName) => | ||
|  |       heroOrName is Hero ? _put(heroOrName) : _post(heroOrName); | ||
|  |   // #enddocregion save
 | ||
|  | 
 | ||
|  |   // #docregion handleError
 | ||
|  |   Exception _handleError(dynamic e) { | ||
|  |     print(e); // for demo purposes only
 | ||
|  |     return new Exception('Server error; cause: $e'); | ||
|  |   } | ||
|  |   // #enddocregion handleError
 | ||
|  | 
 | ||
|  |   // #docregion post
 | ||
|  |   Future<Hero> _post(String name) async { | ||
|  |     try { | ||
|  |       final response = await _http.post(_heroesUrl, | ||
|  |           headers: _headers, body: JSON.encode({'name': name})); | ||
|  |       return new Hero.fromJson(_extractData(response)); | ||
|  |     } catch (e) { | ||
|  |       throw _handleError(e); | ||
|  |     } | ||
|  |   } | ||
|  |   // #enddocregion post
 | ||
|  | 
 | ||
|  |   // #docregion put
 | ||
|  |   Future<Hero> _put(Hero hero) async { | ||
|  |     try { | ||
|  |       var url = '$_heroesUrl/${hero.id}'; | ||
|  |       final response = | ||
|  |           await _http.put(url, headers: _headers, body: JSON.encode(hero)); | ||
|  |       return new Hero.fromJson(_extractData(response)); | ||
|  |     } catch (e) { | ||
|  |       throw _handleError(e); | ||
|  |     } | ||
|  |   } | ||
|  |   // #enddocregion put
 | ||
|  | 
 | ||
|  |   // #docregion delete
 | ||
|  |   Future<Null> delete(int id) async { | ||
|  |     try { | ||
|  |       var url = '$_heroesUrl/$id'; | ||
|  |       await _http.delete(url, headers: _headers); | ||
|  |     } catch (e) { | ||
|  |       throw _handleError(e); | ||
|  |     } | ||
|  |   } | ||
|  |   // #enddocregion delete
 | ||
|  | 
 | ||
|  | } |