Dio

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

安装:

dependencies:
  dio: ^2.1.0

相关 API:

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

GET 请求

import 'package:dio/dio.dart';
void getHttp() async {
  try {
    Response response = await Dio().get("https://www.baidu.com");
    print(response.data.toString());
  } catch (e) {
    print(e);
  }
}
getHttp();

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

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

POST 请求

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

发送 FormData:

适合于 Content-Typeapplication/x-www-form-urlencodedmultipart/form-data

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

发起多个并发请求

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

下载与下载

下载文件:

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

上传文件:

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

监听上传数据进度:

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

请求配置

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

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

完整示例:

void getHttp() async {
  try {
    var dio = new Dio(new BaseOptions(
      baseUrl: "http://172.16.10.121/",
      connectTimeout: 5000,
      receiveTimeout: 100000,
      headers: {
        'Authorization': "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      },
      contentType: ContentType.parse("application/x-www-form-urlencoded"),
      responseType: ResponseType.json,
    ));
    FormData formData = new FormData.from({
      'name': '测试',
    });
    var response = await dio.post('admin/role/add', data: formData);
    print(response.data);
  } catch (e) {
    // 比如授权认证失败: 401 进入catch
    print(e);
  }
}
getHttp();

针对某个请求进行配置:

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

响应数据

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

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

拦截器

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress