# Flutter Http [http](https://pub.dev/packages/http) ``` dependencies: http: ^0.13.5 ``` Model ``` class ProductListResponse { late List<Product> data; late int? nextPaging; static ProductListResponse fromMap(Map<String, dynamic> map) { ProductListResponse productListResponseBean = ProductListResponse(); productListResponseBean.data = [...(map['data'] as List).map((o) => Product.fromMap(o))]; productListResponseBean.nextPaging = map['next_paging']; return productListResponseBean; } Map toJson() => { "data": data, "next_paging": nextPaging, }; } class Product { late int id; late String category; late String? title; late String description; late int price; late String texture; late String wash; late String place; late String note; late String story; late String mainImage; late List<String> images; late List<VariantsBean> variants; late List<ColorsBean> colors; late List<String> sizes; String categoryTitle = ''; Product(this.categoryTitle); static Product fromMap(Map<String, dynamic> map) { Product dataBean = Product(''); dataBean.id = map['id']; dataBean.category = map['category']; dataBean.title = map['title']; dataBean.description = map['description']; dataBean.price = map['price']; dataBean.texture = map['texture']; dataBean.wash = map['wash']; dataBean.place = map['place']; dataBean.note = map['note']; dataBean.story = map['story']; dataBean.mainImage = map['main_image']; dataBean.images = [...(map['images'] as List).map((o) => o.toString())]; dataBean.variants = [...(map['variants'] as List).map((o) => VariantsBean.fromMap(o))]; dataBean.colors = [...(map['colors'] as List).map((o) => ColorsBean.fromMap(o))]; dataBean.sizes = [...(map['sizes'] as List).map((o) => o.toString())]; return dataBean; } Map toJson() => { "id": id, "category": category, "title": title, "description": description, "price": price, "texture": texture, "wash": wash, "place": place, "note": note, "story": story, "main_image": mainImage, "images": images, "variants": variants, "colors": colors, "sizes": sizes, }; } class ColorsBean { late String code; late String name; static ColorsBean fromMap(Map<String, dynamic> map) { ColorsBean colorsBean = ColorsBean(); colorsBean.code = map['code']; colorsBean.name = map['name']; return colorsBean; } Map toJson() => { "code": code, "name": name, }; } class VariantsBean { late String colorCode; late String size; late int stock; static VariantsBean fromMap(Map<String, dynamic> map) { VariantsBean variantsBean = VariantsBean(); variantsBean.colorCode = map['color_code']; variantsBean.size = map['size']; variantsBean.stock = map['stock']; return variantsBean; } Map toJson() => { "color_code": colorCode, "size": size, "stock": stock, }; } ``` #### Usage `Http` 套件只吃 Uri,在 call request 之前要再轉一層 Uri。 接到的物件用 `jsonDecode` 轉成 map,再用 <key, value>的結構把需要的物件 parse 出來。 ``` import 'package:appworks_school_flutter_program/api/product_list_response.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; class ApiService { final baseUrl = 'https://api.appworks-school.tw/api/1.0/products/'; Future<ProductListResponse> getProductList(String productName) async { var uri = Uri.parse('$baseUrl$productName'); var response = await http.get(uri); return ProductListResponse.fromMap(jsonDecode(response.body)); } } ``` ### GET ``` http.get(uri) ``` ### POST ``` http.post(uri) ``` ### PUT ``` http.put(uri) ``` ### DELETE ``` http.delete(uri) ``` ### 帶 body ``` http.post(uri, body: {'key1': 'value1', 'key2': 123} ``` ### 帶 headers ``` http.get(uri, headers: {'key1': 'value1', 'key2': 123}) ``` ui層用 `Future` `async` 關鍵字來做非同步處理 response.then 拿到的 value 就是前面自定義的物件, 可用來更新 ui,用 callback、observer、或是其他套件都可以。 ``` Future<void> getWomenProductList() async { final response = apiService.getProductList('women'); response.then((value) { womenProductList.value = value.data; }); } ```