Dart http 官方库的使用详解

36 min read

Dart http 官方库是许多 Dart 项目都在使用的库,它提供了一种简单的方式来执行 http 请求和处理响应。在本文中,我们将详细介绍 Dart http 的使用方法。

在使用 Dart http 库之前,你需要在你的 pubspec.yaml 文件中加入:

dependencies:
  http: ^0.13.3

其中的 "^0.13.3" 表示使用的最低版本号。你可以根据需要使用更高的版本。

一、发起请求

要发起一个 http 请求,我们可以使用 http 包中的 get、post、put、delete、head 等方法。这些方法的参数都相同,仅有的区别就是请求的方法不同而已。

例如,要发起一个 GET 请求,我们可以这样写:

import 'package:http/http.dart' as http;

void main() async {
  var response = await http.get('https://httpbin.org/get');
  print(response.statusCode);
  print(response.body);
}

这段代码使用了 http.get() 方法来发起一个 GET 请求,并传入了要请求的 URL。执行完该请求后,在控制台上打印出了 HTTP 状态码和响应体。

同样的,如果要发起一个 POST 请求,可以这样写:

var response = await http.post('https://httpbin.org/post', body: {'name': '张三', 'age': 18});

在这里,我们除了传入 URL 之外,还传入了一个 body 参数,即请求体。请求体是一个 Map 类型的参数,里面包含了我们要提交到服务器的数据。在这里我们的请求体是一个包含了姓名和年龄的 Map 对象。当然,我们也可以将请求体作为一个字符串传入,例如:

var response = await http.post('https://httpbin.org/post', body: '{"name": "张三", "age": 18}', headers: {'Content-Type': 'application/json'});

在这里,我们将请求体作为一个 JSON 字符串传入,并设置了 Content-Type 请求头。这告诉服务器我们提交的是一个 JSON 类型的数据。

二、处理响应

当我们发起一个请求后,服务器会返回一个响应。我们可以通过响应对象来获取响应的状态码、响应头、响应体等等。

例如,我们已经在上面的例子中获取了响应对象,现在我们可以通过该对象来获取响应的状态码和响应体:

print(response.statusCode);
print(response.body);

除此之外,我们还可以获取响应头信息,例如:

print(response.headers);

这将打印出服务器返回的所有响应头信息。我们也可以通过指定名称来获取特定的响应头信息,例如:

print(response.headers['content-type']);

在这里,我们获取了 Content-Type 响应头的值,并将其打印出来。

三、处理异常

在通过 http 发起请求的过程中,可能会遇到一些异常,例如无法连接网络、服务器无法响应等等。在这些情况下,我们应该如何处理这些异常呢?

我们可以使用 try-catch 块来捕获这些异常。例如:

import 'dart:convert';
import 'package:http/http.dart' as http;

void main() async {
  try {
    var response = await http.get('https://httpbin.org/get');
    print(response.statusCode);
    print(json.decode(response.body));
  } catch (e) {
    print(e);
  }
}

在这里,我们使用了 try-catch 块来捕获所有异常。如果我们在运行这段代码时遇到了异常,例如网络连接失败,我们将在控制台上看到与异常有关的消息。如果没有遇到任何异常,我们将通过 json.decode() 方法将响应体解析为一个 Map 对象,并在控制台上打印出来。

四、设置请求头

在发起请求时,我们可以向服务器发送一些请求头信息来帮助服务器了解我们的请求。例如,我们可以设置 Accept-Encoding 请求头,请求服务器返回压缩后的响应,示例代码如下:

var headers = {'Accept-Encoding': 'gzip'};
var response = await http.get('https://httpbin.org/get', headers: headers);

同样的,我们可以在请求中设置 Content-Type、User-Agent 等请求头。

五、请求超时

在一些情况下,我们可能会遇到请求超时的情况,这时我们需要设置超时时间来避免等待太久。在 http 包中,我们可以通过 Duration 类型的 timeout 参数来设置请求超时时间。例如,在下面的代码中,我们设置了请求超时时间为 5 秒:

var response = await http.get('https://httpbin.org/get').timeout(Duration(seconds: 5));

当请求超时时,http 抛出的是一个 TimeoutException 异常。我们可以通过 try-catch 块来捕获该异常,并处理它。

到此,我们已经介绍了 Dart http 官方库的基本用法。当你想要发起 http 请求时,记得首选该库。