1、dio使用post请求时,如果content-type是form-data,我们需要通过FormData类来构建数据,否则服务器将无法识别,同时需要传入一个Option指明content-type,而form-data的content-type完整类型表述为:multipart/form-data,昨天在这两个问题上卡了很久,归根结底还是自己对于http协议不够熟悉,以后还需要加强这方面的知识。
2、使用dio的get post方法时,如果没有指明泛型类型,那么返回的Response对象的data变量,默认应该是String,这时候是不能直接传入实体类的fromJson方法的,最好是指定泛型为Map<String,dynamic>,这样返回的数据就是一个json序列化字符串了,然后再解析就行了。
下面是我封装的dio请求数据
import 'package:dio/dio.dart';
import 'common_interceptor.dart';
class HttpManager {
static HttpManager _instance;
static HttpManager getInstance() {
if (_instance == null) {
_instance = HttpManager();
}
return _instance;
}
Dio _dio = Dio();
String host = "这里填入服务器地址";
HttpManager() {
_dio.options.baseUrl = "http://$host/";
_dio.options.connectTimeout = 3000;
_dio.options.receiveTimeout = 3000;
_dio.interceptors.add(CommonInterceptor());//这里自定义了一个拦截器,用于在header里面自动填入token数据
_dio.interceptors
.add(LogInterceptor(responseBody: true, requestBody: true));
}
Future<Map<String, dynamic>> get(
String path, Map<String, dynamic> params) async {
var response =
await _dio.get<Map<String, dynamic>>(path, queryParameters: params);
return response.data;
}
Future<Map<String, dynamic>> postByFormData(
String path, Map<String, dynamic> params) async {
var data = FormData.fromMap(params);
var response = await _dio.post<Map<String, dynamic>>(path,
data: data, options: Options(contentType: "multipart/form-data"));
return response.data;
}
Future<Map<String, dynamic>> postByJson(
String path, Map<String, dynamic> params) async {
var response = await _dio.post<Map<String, dynamic>>(path,
data: params, options: Options(contentType: "application/json"));
return response.data;
}
}