一个可组合的、基于Future的HTTP请求库。
此包包含一组高级函数和类,可轻松使用HTTP资源。它是多平台的,支持移动、桌面和浏览器。
使用方法
使用此库的最简单方法是通过顶级函数。它们允许您轻松地进行单个HTTP请求
import 'package:http/http.dart' as http;
var url = Uri.parse('https://example.com/whatsit/create');
var response = await http.post(url, body: {'name': 'doodle', 'color': 'blue'});
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');
print(await http.read(Uri.parse('https://example.com/foobar.txt')));
如果您向同一服务器发出多个请求,可以通过使用Client来保持持久连接,而不是一次性请求。如果您这样做,请确保在完成后关闭客户端
var client = http.Client();
try {
var response = await client.post(
Uri.https('example.com', 'whatsit/create'),
body: {'name': 'doodle', 'color': 'blue'});
var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map;
var uri = Uri.parse(decodedResponse['uri'] as String);
print(await client.get(uri));
} finally {
client.close();
}
您还可以通过自己创建Request或StreamedRequest对象并将它们传递给Client.send来更精细地控制您的请求和响应。
此包旨在可组合。这使得外部库可以轻松地相互协作,为其添加行为。希望添加行为的库应该创建BaseClient的子类,该子类包装另一个Client并添加所需的行为
class UserAgentClient extends http.BaseClient {
final String userAgent;
final http.Client _inner;
UserAgentClient(this.userAgent, this._inner);
Future<http.StreamedResponse> send(http.BaseRequest request) {
request.headers['user-agent'] = userAgent;
return _inner.send(request);
}
}
重试请求
package:http/retry.dart提供了一个名为RetryClient的类,用于包装底层http.Client,该类可以透明地重试失败的请求。
import 'package:http/http.dart' as http;
import 'package:http/retry.dart';
Future<void> main() async {
final client = RetryClient(http.Client());
try {
print(await client.read(Uri.parse('http://example.org')));
} finally {
client.close();
}
}
默认情况下,此请求最多重试三次状态码为503(Temporary Failure)的请求。第一次重试前等待500毫秒,之后每次延迟增加1.5倍。所有这些都可以通过RetryClient()构造函数进行自定义。