發出 HTTP 請求


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();

PUTPATCH 的請求本體設置方式,也是類似的,若需要做 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〉。