刚开始接触Flutter,需要封装一个Http请求文件。废话不多直接上代码
1.设置全局变量,用来缓存Token信息
class Global {
static String _tokenId = "";
Global() {
_tokenId = "";
}
//设置token信息
static void setTokenId(val) {
_tokenId = val;
}
//调用tokenId信息
static String getTokenId() {
return _tokenId;
}
}
1.封装Http请求信息
import 'package:dio/dio.dart';
import 'package:/common/global.dart';
class HttpUtil {
//实例化对象
static HttpUtil _instance;
Dio _dio;
BaseOptions _options;
CancelToken cancelToken = new CancelToken();
static HttpUtil getInstance() {
if (null == _instance) _instance = new HttpUtil();
return _instance;
}
/*
* config it and create
*/
HttpUtil() {
//BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
var baseOptions = new BaseOptions(
//请求基地址,可以包含子路径
baseUrl: "http://127.0.0.1:8080",
//连接服务器超时时间,单位是毫秒.
connectTimeout: 30000,
//响应流上前后两次接受到数据的间隔,单位为毫秒。
receiveTimeout: 120000,
//Http请求头.
headers: {
"Accept": "application/json",
//do something
"TokenId": Global.getTokenId(),
},
//请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
contentType: "application/json",
//表示期望以那种格式(方式)接受响应数据。接受三种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
responseType: ResponseType.json,
);
_options = baseOptions;
_dio = new Dio(_options);
}
//设置初始化信息
setBaseOptions(String tokenId) async {
var baseOptions = new BaseOptions(
//请求基地址,可以包含子路径
baseUrl: "http://127.0.0.1:8080",
//连接服务器超时时间,单位是毫秒.
connectTimeout: 30000,
//响应流上前后两次接受到数据的间隔,单位为毫秒。
receiveTimeout: 120000,
//Http请求头.
headers: {
"Accept": "application/json",
//do something
"TokenId": tokenId,
},
//请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
contentType: "application/json",
//表示期望以那种格式(方式)接受响应数据。接受三种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
responseType: ResponseType.json,
);
_options = baseOptions;
_dio = new Dio(_options);
}
/*
* get请求(不带参)
*/
get(url) async {
Response response;
try {
print('get:' + url);
response = await _dio.get(url);
// print('get success---------${response.statusCode}');
print('get success:${response.data}');
return response.data;
} catch (e) {
print('get error:$e');
formatError(e);
}
return null;
}
/*
* get请求参数传参
*/
getData(url, {data}) async {
Response response;
try {
print('get data:' + url);
Map<String, dynamic> k = data;
response = await _dio.get(url, queryParameters: k);
// print('get success---------${response.statusCode}');
print('get data success:${response.data}');
return response.data;
} catch (e) {
print('get data error:$e');
formatError(e);
}
return null;
}
/*
* post请求,对象传参
*/
postData(url, {data}) async {
Response response;
try {
print('post data:' + url);
response = await _dio.post(url, data: data);
print('post data success:${response.data}');
return response.data;
} on DioError catch (e) {
print('post data error:$e');
formatError(e);
}
return null;
}
/*
* post请求,参数传参
*/
postParam(url, {data}) async {
Response response;
Map<String, dynamic> k = data;
try {
print('post param:' + url);
response = await _dio.post(url, queryParameters: k);
print('post param success:${response.data}');
return response.data;
} on DioError catch (e) {
print('post param error:$e');
formatError(e);
}
return null;
}
/*
* 下载文件
*/
downloadFile(urlPath, savePath) async {
Response response;
try {
print('download :' + urlPath);
response = await _dio.download(urlPath, savePath,
onReceiveProgress: (int count, int total) {
//进度
print("现在进度: 当前:$count 总:$total");
});
if (response.data.statusCode == 200) {
print('文件下载完成!:${response.data}');
return true;
}
} on DioError catch (e) {
print('downloadFile error:$e');
formatError(e);
}
return false;
}
/*
* 异常处理
*/
void formatError(DioError e) {
if (e.type == DioErrorType.CONNECT_TIMEOUT) {
// It occurs when url is opened timeout.
print("连接超时");
} else if (e.type == DioErrorType.SEND_TIMEOUT) {
// It occurs when url is sent timeout.
print("请求超时");
} else if (e.type == DioErrorType.RECEIVE_TIMEOUT) {
//It occurs when receiving timeout
print("响应超时");
} else if (e.type == DioErrorType.RESPONSE) {
// When the server response, but with a incorrect status, such as 404, 503...
print("出现异常");
} else if (e.type == DioErrorType.CANCEL) {
// When the request is cancelled, _dio will throw a error with this type.
print("请求取消");
} else {
//DEFAULT Default error type, Some other Error. In this case, you can read the DioError.error if it is not null.
print("未知错误");
}
}
}
3.接口调用方式
import '/utils/httpUtils.dart';
HttpUtil _httpUtil;
@override
void initState() {
_httpUtil = new HttpUtil();
}
//Body调用
var data = await _httpUtil.postData("/api/postData", data: {"a": '123'});
//参数调用
var data = await _httpUtil.getData("/api/getData", data: {"a": "123"});
//无参调用
var data = await _httpUtil.get('/api/get');
//post 参数调用
var data = await _httpUtil.postParam('/api/postParam', data: {"a": "123"});
if (data != null) {
//重新刷新界面
setState(() {});
}