首先 pubspec.yaml里面添加dio依赖模块
dio: ^3.0.10
由于 http请求常用的是GET和POST方法, 请求参数格式要么JSON,要么XML, 所以我在第一次封装dio http请求时用了四个方法:Get with Json, GET with XML, Post with Json, Post with xml。
完成后发现好多重复代码,于是就相办法把四个方法合并成一个方法,调用的时候传入需要的参数即可
譬如 请求method, 可传入“GET”, 或“POST”,
请求参数类型contentType 可传入“JSON” 或“XML”
回调函数 onSuccess, onError
具体代码如下
import 'dart:convert' show json;
import 'dart:io';
import 'package:dio/dio.dart';
class DioUtils {
/// global dio object
static Dio dio;
/// http request methods
static Map<String, dynamic> jsonHeaders = {
'Accept': 'application/json,*/*',
'Content-Type': 'application/json',
};
static Map<String, dynamic> xmlHeaders = {
'Accept': 'application/xml,*/*',
'Content-Type': 'application/xml;charset=UTF-8',
};
static void requestHttp<T>(String url, //请求地址url
{parameters, //get 请求时的param list
method, // “GET” 或者 “POST”
data, // post 请求时上传的数据
contentType, // 请求data 是 json 或者 xml
Function(T t) onSuccess, //请求成功时的回调函数
Function(String error) onError //请求失败时的回调函数
}) async {
method = method ?? 'GET';
contentType = contentType ?? 'JSON';
Map<String, dynamic> httpHeaders;
if (contentType == 'XML') {
httpHeaders = jsonHeaders;
} else {
httpHeaders = xmlHeaders;
}
var options = BaseOptions(
connectTimeout: 3000,
receiveTimeout: 3000,
responseType: ResponseType.json,
validateStatus: (status) {
// 不使用http状态码判断状态,使用AdapterInterceptor来处理(适用于标准REST风格)
return true;
},
baseUrl: "");
try {
if (dio == null) {
dio = new Dio(options);
}
dio.options.headers = httpHeaders;
Response response;
if (method == "GET") {
if (parameters == null) {
response = await dio.get(url);
} else {
response = await dio.get(url, queryParameters: parameters);
}
} else if (method == "POST") {
if (data == null) {
response = await dio.post(url);
} else {
response = await dio.post(url, data: data);
}
}
var responseData = response.data;
if (response.statusCode == 200) {
if (onSuccess != null) {
onSuccess(responseData);
}
} else {
throw Exception('erroMsg:${response.statusCode}');
}
print('响应数据:' + response.toString());
} catch (e) {
print('请求出错:' + e.toString());
if (onError != null) onError(e.toString());
}
}
}
GET 方法调用例子:
onSuccess(var responseData) {
print("callback funtion onSuccess called");
}
onError(var error) {
print("callback funtion onError error:$error");
}
await DioUtils.requestHttp("http://XXXXXXX,
method: "GET",
onSuccess: onSuccess,
onError: onError);
POST 方法调用例子:
g
onSuccess(var responseData) {
print("callback funtion onSuccess called");
}
onError(var error) {
print("callback funtion onError error:$error");
}
getPageData() async {
var _data = "<request key=\"xxxxx\">……</request>";
await DioUtils.requestHttp("http://XXXXXXXX",
data: _data,
method: "POST",
contentType: "XML",
onSuccess: onSuccess,
onError: onError);
}
以上代码基本上能满足一个简单app的http Get/Post请求。