dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等...
使用dio三方库必然也需要先在pubspec中依赖它:
dio:^3.0.1
1.简单使用
代码演练:
import'package:dio/dio.dart';
void dioNetwork() async {
// 1.创建Dio请求对象
final dio = Dio();
// 2.发送网络请求
final response = await dio.get("http://123.207.32.32:8000/api/v1/recommend");
// 3.打印请求结果
if (response.statusCode == HttpStatus.ok) {
print(response.data);
} else {
print("请求失败:${response.statusCode}");
}
}
2.dio库的封装
http_config.dart
class HTTPConfig {
static const baseURL = "https://httpbin.org";
static const timeout = 5000;
}
http_request.dart
import 'package:dio/dio.dart';
import 'http_config.dart';
class HttpRequest{
static BaseOptions baseOptons = BaseOptions(baseUrl:HTTPConfig.baseURL,connectTimeout: HTTPConfig.timeout);
static Dio dio = Dio(baseOptons);
static Future<T> request<T>(String url,{String method="get",Map<String,dynamic>params,Interceptor inter}) async {
//1.请求的单独配置
final options = Options(method: method);
//2.添加第一个拦截器
Interceptor dInter = InterceptorsWrapper(
onRequest: (RequestOptions options){
//1. 在进行任何网络请求的时候,可以添加一个loading显示
//2.很多页面的访问必须要求携带Token,那么就可以在这里判断是否有Token
//3.对参数进行一些处理,比如序列化处理等
print("拦截了请求");
return options;
},
onResponse: (Response response){
print("拦截了响应");
return response;
},
onError: (DioError error){
print("拦截了错误");
return error;
}
);
List<Interceptor> inters = [dInter];
if(inter != null){
inters.add(inter);
}
dio.interceptors.addAll(inters);
//3.发送网络请求
try{
Response response = await dio.request<T>(url,queryParameters: params,options: options);
return response.data;
}on DioError catch(e){
return Future.error(e);
}
}
}
代码使用:
HttpRequest.request("https://httpbin.org/get", params: {"name": "why", 'age': 18}).then((res) {
print(res);
});
HttpRequest.request("https://httpbin.org/post",
method: "post", params: {"name": "why", 'age': 18}).then((res) {
print(res);
});