Flutter 网络请求插件 -- dio
2022-07-20 本文已影响0人
不不不紧张
dio 是目前Flutter 最流行的网络请求插件
插件地址:https://pub.flutter-io.cn/packages/dio
官方给出的例子
import 'package:dio/dio.dart';
void getHttp() async {
try {
var response = await Dio().get('http://www.google.com');
print(response);
} catch (e) {
print(e);
}
}
使用方法
1. 初始化与相关设置
BaseOptions options = BaseOptions(
connectTimeout: 30000,
receiveTimeout: 30000,
responseType: ResponseType.json,
);
dio = Dio(options);
2. 请求方法
/// Make http request with options.
///
/// [path] The url path.
/// [data] The request data
/// [options] The request options.
Future<Response<T>> request<T>(
String path, {
data,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
Options? options,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
});
例子:
Response response = await dio.request(
url,//地址
data: data, //参数
queryParameters: queryParameters,
options: checkOptions(method, options, checkToken),// 请求配置
cancelToken: cancelToken //取消请求token
);
3. 请求配置
使用请求方法中的options参数进行配置
配置选项
Options({
this.method, //请求方式 get,post
this.sendTimeout,
this.receiveTimeout,
this.extra,
this.headers,
this.responseType,
this.contentType,
this.validateStatus,
this.receiveDataWhenStatusError,
this.followRedirects,
this.maxRedirects,
this.requestEncoder,
this.responseDecoder,
this.listFormat,
});
选项中各个变量的注释
/// Http method.
String? method;
/// Http request headers. The keys of initial headers will be converted to lowercase,
/// for example 'Content-Type' will be converted to 'content-type'.
///
/// The key of Header Map is case-insensitive, eg: content-type and Content-Type are
/// regard as the same key.
Map<String, dynamic>? headers;
/// Timeout in milliseconds for sending data.
/// [Dio] will throw the [DioError] with [DioErrorType.sendTimeout] type
/// when time out.
int? sendTimeout;
/// Timeout in milliseconds for receiving data.
///
/// Note: [receiveTimeout] represents a timeout during data transfer! That is to say the
/// client has connected to the server, and the server starts to send data to the client.
///
/// [0] meanings no timeout limit.
int? receiveTimeout;
/// The request Content-Type. The default value is [ContentType.json].
/// If you want to encode request body with 'application/x-www-form-urlencoded',
/// you can set `ContentType.parse('application/x-www-form-urlencoded')`, and [Dio]
/// will automatically encode the request body.
String? contentType;
/// [responseType] indicates the type of data that the server will respond with
/// options which defined in [ResponseType] are `json`, `stream`, `plain`.
///
/// The default value is `json`, dio will parse response string to json object automatically
/// when the content-type of response is 'application/json'.
///
/// If you want to receive response data with binary bytes, for example,
/// downloading a image, use `stream`.
///
/// If you want to receive the response data with String, use `plain`.
///
/// If you want to receive the response data with original bytes,
/// that's to say the type of [Response.data] will be List<int>, use `bytes`
ResponseType? responseType;
/// `validateStatus` defines whether the request is successful for a given
/// HTTP response status code. If `validateStatus` returns `true` ,
/// the request will be perceived as successful; otherwise, considered as failed.
ValidateStatus? validateStatus;
/// Whether receiving response data when http status code is not successful.
/// The default value is true
bool? receiveDataWhenStatusError;
/// Custom field that you can retrieve it later in [Interceptor]、[Transformer] and the [Response] object.
Map<String, dynamic>? extra;
/// see [HttpClientRequest.followRedirects],
/// The default value is true
bool? followRedirects;
/// Set this property to the maximum number of redirects to follow
/// when [followRedirects] is `true`. If this number is exceeded
/// an error event will be added with a [RedirectException].
///
/// The default value is 5.
int? maxRedirects;
/// The default request encoder is utf8encoder, you can set custom
/// encoder by this option.
RequestEncoder? requestEncoder;
/// The default response decoder is utf8decoder, you can set custom
/// decoder by this option, it will be used in [Transformer].
ResponseDecoder? responseDecoder;
/// The [listFormat] indicates the format of collection data in request
/// query parameters and `x-www-url-encoded` body data.
/// Possible values defined in [ListFormat] are `csv`, `ssv`, `tsv`, `pipes`, `multi`, `multiCompatible`.
/// The default value is `multi`.
ListFormat? listFormat;
配置举例:
- post请求
options.method = "POST";
- 请求头添加参数
options.headers["abc"] = "123";
- 表单请求
options.contentType = "application/x-www-form-urlencoded";
4. 请求拦截器
拦截器可以在dio对象发起请求和收到接口返回的数据时执行相应的方法,实现网络请求相关业务的统一处理
dio = Dio(options);
///拦截器
dio.interceptors.add(AuthTool());
其中AuthTool类继承于Interceptor,并在内部重写Interceptor类中的onRequest(发起请求),onResponse(收到数据),onError(请求出错)方法,就可以在dio对象发起请求,收到数据,和请求出错时调用对应的重写方法,实现对请求各个状态的统一处理
拦截器举例:
class AuthTool extends Interceptor {
@override
onRequest(RequestOptions options, RequestInterceptorHandler handler) {
// 统一添加请求头
options.headers["abc"] = "123";
return super.onRequest(options, handler);
}
@override
onResponse(Response response, ResponseInterceptorHandler handler) {
// 请求成功打印返回数据
Log.json(json.encode(response.data), path: response.requestOptions.path);
return super.onResponse(response, handler);
}
@override
onError(DioError err, ErrorInterceptorHandler handler) {
// 请求错误打印error
Log.d("----------Error-----------");
return super.onError(err, handler);
}
}
欢迎指正