dio 是一个强大的 Dart Http 请求库,支持 Restful API、FormData、拦截器、请求取消、Cookie 管理、文件上传/下载、超时等。

安装:

  1. dependencies:
  2. dio: ^2.1.0

相关 API:

  • Future get(…)
  • Future post(…)
  • Future put(…)
  • Future delete(…)
  • Future head(…)
  • Future put(…)
  • Future path(…)
  • Future download(…)

GET 请求

  1. import 'package:dio/dio.dart';
  2. void getHttp() async {
  3. try {
  4. Response response = await Dio().get("https://www.baidu.com");
  5. print(response.data.toString());
  6. } catch (e) {
  7. print(e);
  8. }
  9. }
  10. getHttp();

查询字符串可通过参数传递:

  1. response = await Dio().get("/test", queryParameters: {"id": 12, "name": "wendu"});

POST 请求

  1. var dio = new Dio();
  2. Response response = await dio.post("/test", data: {"id": 12, "name": "wendu"});
  3. print(response.data.toString());

发送 FormData:
适合于 Content-Typeapplication/x-www-form-urlencodedmultipart/form-data

  1. FormData formData = new FormData.from({
  2. "name": "wendux",
  3. "age": 25,
  4. });
  5. var response = await dio.post("/info", data: formData);

发起多个并发请求

  1. Response response = await Future.wait([dio.post("/info"), dio.get("/token")]);

下载与下载

下载文件:

  1. Response response = await dio.download("https://www.baidu.com", "./baidu.html");

上传文件:

  1. FormData formData = new FormData.from({
  2. "name": "wendux",
  3. "age": 25,
  4. "file1": new UploadFileInfo(new File("./upload.txt"), "upload1.txt"),
  5. //支持直接上传字节数组 (List<int>) ,方便直接上传内存中的内容
  6. "file2": new UploadFileInfo.fromBytes(
  7. utf8.encode("hello world"), "word.txt"),
  8. // 支持文件数组上传
  9. "files": [
  10. new UploadFileInfo(new File("./example/upload.txt"), "upload.txt"),
  11. new UploadFileInfo(new File("./example/upload.txt"), "upload.txt")
  12. ]
  13. });
  14. var response = await dio.post("/info", data: formData);

监听上传数据进度:

  1. var response = await dio.post(
  2. "http://www.dtworkroom.com/doris/1/2.0.0/test",
  3. data: {"aa": "bb" * 22},
  4. onSendProgress: (int sent, int total) {
  5. print("$sent $total");
  6. },
  7. );

请求配置

下面是所有的请求配置选项。如果请求 method 没有指定,则默认为 GET:

  1. {
  2. /// Http method.
  3. String method;
  4. /// 请求基地址,可以包含子路径,如: "https://www.google.com/api/".
  5. String baseUrl;
  6. /// Http请求头.
  7. Map<String, dynamic> headers;
  8. /// 连接服务器超时时间,单位是毫秒.
  9. int connectTimeout;
  10. /// 2.x中为接收数据的最长时限.
  11. int receiveTimeout;
  12. /// 请求路径,如果 `path` 以 "http(s)"开始, 则 `baseURL` 会被忽略; 否则, 将会和baseUrl拼接出完整的的url.
  13. String path = "";
  14. /// 请求的Content-Type,默认值是 `ContentType.JSON`.
  15. /// 如果您想以"application/x-www-form-urlencoded"格式编码请求数据
  16. /// 可以设置此选项为 `ContentType.parse("application/x-www-form-urlencoded")`, 这样Dio就会自动编码请求体.
  17. ContentType contentType;
  18. /// [responseType] 表示期望以那种格式(方式)接受响应数据。
  19. /// 目前 [ResponseType] 接受三种类型 `JSON`, `STREAM`, `PLAIN`.
  20. ///
  21. /// 默认值是 `JSON`, 当响应头中content-type为"application/json"时,dio 会自动将响应内容转化为json对象。
  22. /// 如果想以二进制方式接受响应数据,如下载一个二进制文件,那么可以使用 `STREAM`.
  23. ///
  24. /// 如果想以文本(字符串)格式接收响应数据,请使用 `PLAIN`.
  25. ResponseType responseType;
  26. /// `validateStatus` 决定http响应状态码是否被dio视为请求成功, 返回`validateStatus`
  27. /// 返回`true` , 请求结果就会按成功处理,否则会按失败处理.
  28. ValidateStatus validateStatus;
  29. /// 用户自定义字段,可以在 [Interceptor]、[Transformer] 和 [Response] 中取到.
  30. Map<String, dynamic> extra;
  31. /// 公共query参数
  32. Map<String, dynamic /*String|Iterable<String>*/ > queryParameters;
  33. }

完整示例:

  1. void getHttp() async {
  2. try {
  3. var dio = new Dio(new BaseOptions(
  4. baseUrl: "http://172.16.10.121/",
  5. connectTimeout: 5000,
  6. receiveTimeout: 100000,
  7. headers: {
  8. 'Authorization': "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  9. },
  10. contentType: ContentType.parse("application/x-www-form-urlencoded"),
  11. responseType: ResponseType.json,
  12. ));
  13. FormData formData = new FormData.from({
  14. 'name': '测试',
  15. });
  16. var response = await dio.post('admin/role/add', data: formData);
  17. print(response.data);
  18. } catch (e) {
  19. // 比如授权认证失败: 401 进入catch
  20. print(e);
  21. }
  22. }
  23. getHttp();

针对某个请求进行配置:

  1. var response = await dio.post(url, options: Options(
  2. contentType: ContentType.JSON
  3. ));

响应数据

当请求成功时会返回一个 Response 对象,它包含如下字段:

  1. {
  2. var data; // 响应数据
  3. HttpHeaders headers; // 响应头
  4. Options request; // 本次请求信息
  5. int statusCode; // Http status code.
  6. bool isRedirect; // 是否重定向
  7. List<RedirectInfo> redirects; // 重定向信息
  8. Uri realUri; // 最终真正的请求地址(因为可能会重定向)
  9. Map<String, dynamic> extra; // 响应对象的自定义字段(可以在拦截器中设置它),调用方可以在`then`中获取.
  10. }

拦截器