# 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;
});
}
```