dart:io
包含了 HttpClient
,可以用來發起 HTTP 請求,例如,JSONPlaceholder 提供了簡單的 REST API,可以用來進行簡單的請求測試,可參考它的〈Guide〉來認識協定方式。
來看看如何對 https://jsonplaceholder.typicode.com/users 發出請求:
var httpClient = HttpClient();
// 使用 GET 建立 HttpClientRequest
var request = await httpClient.getUrl(
// 建立 Uri
Uri.https('jsonplaceholder.typicode.com', '/users')
);
// 取得 HttpClientResponse
var response = await request.close();
// 等待回應、轉換回應串流為 UTF8
var responseBody = await response.transform(utf8.decoder).join();
httpClient.close();
這會取得 JSON 回應,最後以字串指定給 responseBody
,就上例來說,responseBody
會是 10 筆使用者資料的 JSON 格式字串,之後就可以透過 jsonDecode
轉換為 Dart 物件。
如果要指定請求參數的話,建立 Uri
時可以如下:
// 請求參數 id 設為 2
Uri.https('jsonplaceholder.typicode.com', '/users', {'id': '2'})
也可以直接建構 Uri
實例,例如:
var request = await httpClient.getUrl(
// 建立 Uri
Uri(
scheme: 'https',
host: 'jsonplaceholder.typicode.com',
path: 'users',
queryParameters: {'id': '2'}
)
);
若要發出 POST,並在請求本體設定請求參數,可以如下:
var httpClient = HttpClient();
// 使用 POST
var request = await httpClient.postUrl(
Uri.https('jsonplaceholder.typicode.com', '/users')
);
// 設置請求標頭
request.headers.add('Content-type', 'application/json; charset=UTF-8');
// 設置請求本體,使用 dart:convert 的 utf8.encode
request.add(utf8.encode(jsonEncode({
'id': 11,
'name': 'Justin Lin',
'username': 'caterpillar',
'email': 'caterpillar@openhome.cc'
})));
var response = await request.close();
// 使用 dart:convert 的 utf8.decoder
var responseBody = await response.transform(utf8.decoder).join();
PUT
、PATCH
的請求本體設置方式,也是類似的,若需要做 URI 編碼,可以透過 Uri.encodeQueryComponent
,如果是串流,可以透過 addStream
來設置。
對於這類簡單的請求,可以將流程封裝起來,http
套件就提供了這類封裝,想要使用的話,可以在 pubspec.yaml 中加入:
dependencies:
http: ^0.12.2
如果如下 import
:
import 'package:http/http.dart' as http;
要發出個 GET 請求就可以簡化如下:
var response = await http.get('https://jsonplaceholder.typicode.com/users');
var responseBody = response.body;
要發出個 POST 請求的話,可以簡化如下:
var response = await http.post('https://jsonplaceholder.typicode.com/users',
headers: {
'Content-type': 'application/json; charset=UTF-8'
},
body: utf8.encode(jsonEncode({
'id': 11,
'name': 'Justin Lin',
'username': 'caterpillar',
'email': 'caterpillar@openhome.cc'
}))
);
var responseBody = response.body;
想要看看實際結合 Flutter 的範例應用,可以進一步參考 Fluttter 官方文件的〈Networking〉。