一个可组合的、基于Future的HTTP请求库。

pub package Build Status

此包包含一组高级函数和类,可轻松使用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();
}

您还可以通过自己创建RequestStreamedRequest对象并将它们传递给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()构造函数进行自定义。

GitHub

查看 Github