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-Type
为 application/x-www-form-urlencoded
或 multipart/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`中获取.
}