flutter封装http请求,dio中⽂乱码,dio包request是post⽆法传参,
dio传参时乱码,了好久都没到问题,按照⽹上的⽅法导⼊了gbkutf8什么的都没⽤。后来发现是我在post的时候把参数放在queryParameters传给后台,才会在数据存乱码。⼀开始之所以会在post的时候,把参数放在request的queryParameters⾥是因为⼀开始没有指定contentType,contentType默认是json的,将参数传给data的时候⽆法将参数传给后台
后来了dio官⽅地址,发现contentType默认是application/json,将contenType改⽤application/x-www-form-urlencoded就能将参数按表单序列化,post就能传参,中⽂问题也解决了。
封装的http请求:
import 'dart:collection';
import 'package:binhu_doctor_flutter/config/config.dart';
import 'package:binhu_doctor_flutter/http/http_error.dart';
import 'package:binhu_doctor_flutter/utils/log_util.dart';
import 'package:binhu_doctor_flutter/utils/utils.dart';
import 'package:connectivity/connectivity.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:oktoast/oktoast.dart';
///数据解析回调
typedef T JsonParse<T>(dynamic data);
class HttpRequest {
static String BASE_URL = Config.apiBaseUrl;
static const CONTENT_TYPE_JSON = 'application/json';
static const CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded';
static Future<T> get<T> ({
@required String url,
Map<String, dynamic> params,
bool isCompleteUrl = false,
JsonParse<T> jsonParse,
Options options,
}) async {
return _request(
url,
params: params,
jsonParse: jsonParse,
isCompleteUrl: isCompleteUrl,
options: options,
method: 'get',
);
}
static Future<T> post<T> ({
@required String url,
Map<String, dynamic> data,
bool isCompleteUrl = false,
JsonParse<T> jsonParse,
Options options,
}) async {
return _request(
url,
data: data,
jsonParse: jsonParse,
isCompleteUrl: isCompleteUrl,
options: options,
method: 'post',
);
}
static Future<T> _request<T>(
url, {
String method,
Map<String, dynamic> params,
Map<String, dynamic> data,
Options options,
bool onTip = false,
bool isCompleteUrl = false,
error parse newJsonParse<T> jsonParse,
}) async {
ConnectivityResult connectivityResult =
await (Connectivity().checkConnectivity());
if (connectivityResult == ) {
LogUtil.v('请求⽹络异常,请稍后重试!');
showToast('请求⽹络异常,请稍后重试!');
throw (HttpError(HttpError.NETWORK_ERROR, '⽹络异常,请稍后重试!'));
}
Dio dio = new Dio();
String token = ken;
options = options ?? new Options();
// 将contentType改为默认application/x-www-form-urlencoded
Response<Map<String, dynamic>> response;
if (Config.isDev == true) dio.interceptors.add(LogInterceptor());
if (isCompleteUrl == false) url = BASE_URL + url;
if (options.headers != null) options.headers['token'] = token;
try {
print('参数-------------------------${data}');
response = quest(url, data: data, queryParameters: params, options: options); String statusCode = response.data['code'].toString();
LogUtil.v(response);
if (statusCode == '200' || statusCode == '300') {
if (jsonParse != null) {
return jsonParse(response.data['object']);
} else {
return response.data['object'];
}
} else {
// 失败
String message = response.data['message'];
int code = response.data['code'];
LogUtil.v('请求服务器出错:$message');
showToast('$code: $message');
((HttpError(statusCode, message)));
}
} on DioError catch (e, s) {
showToast('发⽣了不可描述的错误!\n$e');
LogUtil.v('请求出错:$e');
throw (HttpError.dioError(e));
} catch (e, s) {
showToast('发⽣了不可描述的错误!\n$e');
LogUtil.v('未知异常出错:$e\n$s');
throw (HttpError(HttpError.UNKNOWN, '⽹络异常,请稍后重试!')); }
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论