red Flutter solicita biblioteca paquete Dio (única forma de realización, la dinámica baseUrl, interceptor)

https://www.jianshu.com/p/5ead0cf96642

 

Varios beneficios solicitudes de red del paquete:
1, para facilitar los parámetros unificadas de configuración de petición, como cabecera, el parámetro público, reglas cifrados
2, para facilitar la depuración, registro de impresión
3, el código para optimizar el rendimiento, al abuso de evitar en todas partes nuevo constructo único objeto mundial Ejemplo
4, simplificar solicitando paso, exponiendo sólo los datos de respuesta requeridos en respuesta a la corrección de errores unificado
5, la clase base encapsula la interfaz de datos, simplificado de análisis de proceso
resultados ejemplo:


 
image.png

definición HttpManager

La configuración general de una única forma de realización, la solicitud de configuración de parámetros, la GET configuración genérica \ POST, apoyo traspaso baseUrl

class HttpManager {
  static HttpManager _instance = HttpManager._internal(); Dio _dio; factory HttpManager() => _instance; ///通用全局单例,第一次使用时初始化 HttpManager._internal({String baseUrl}) { if (null == _dio) { _dio = new Dio(new BaseOptions( baseUrl: Address.BASE_URL_RELEASE, connectTimeout: 15000)); _dio.interceptors.add(new LogsInterceptors()); _dio.interceptors.add(new ResponseInterceptors()); } } static HttpManager getInstance({String baseUrl}) { if (baseUrl == null) { return _instance._normal(); } else { return _instance._baseUrl(baseUrl); } } //用于指定特定域名,比如cdn和kline首次的http请求 HttpManager _baseUrl(String baseUrl) { if (_dio != null) { _dio.options.baseUrl = baseUrl; } return this; } //一般请求,默认域名 HttpManager _normal() { if (_dio != null) { if (_dio.options.baseUrl != Address.BASE_URL_RELEASE) { _dio.options.baseUrl = Address.BASE_URL_RELEASE; } } return this; } ///通用的GET请求 get(url, params, {noTip = false}) async { Response response; try { response = await _dio.get(url, queryParameters: params); } on DioError catch (e) { return resultError(e); } if (response.data is DioError) { return resultError(response.data['code']); } return response.data; } ///通用的POST请求 post(url, params, {noTip = false}) async { Response response; try { response = await _dio.post(url, data: params); } on DioError catch (e) { return resultError(e); } if (response.data is DioError) { return resultError(response.data['code']); } return response.data; } } 

interceptor de registro

La solicitud y de retorno parámetros de impresión

import 'package:dio/dio.dart';

class LogsInterceptors extends InterceptorsWrapper { 

En respuesta interceptor

Filtradas datos de respuesta correctas, los datos preliminares de encapsulación

import 'package:dio/dio.dart';
import 'package:exchange_flutter/common/net/code.dart'; import 'package:flutter/material.dart'; import '../result_data.dart'; class ResponseInterceptors extends InterceptorsWrapper { @override onResponse(Response response) { RequestOptions option = response.request; try { if (option.contentType != null && option.contentType.primaryType == "text") { return new ResultData(response.data, true, Code.SUCCESS); } ///一般只需要处理200的情况,300、400、500保留错误信息 if (response.statusCode == 200 || response.statusCode == 201) { int code = response.data["code"]; if (code == 0) { return new ResultData(response.data, true, Code.SUCCESS, headers: response.headers); } else if (code == 100006 || code == 100007) { } else { Fluttertoast.showToast(msg: response.data["msg"]); return new ResultData(response.data, false, Code.SUCCESS, headers: response.headers); } } } catch (e) { print(e.toString() + option.path); return new ResultData(response.data, false, response.statusCode, headers: response.headers); } return new ResultData(response.data, false, response.statusCode, headers: response.headers); } } 

En respuesta a la clase base

IsSuccess predeterminado de 200 es verdadera, la respuesta es response.data, asignado a los datos

class ResultData {
  var data; bool isSuccess; int code; var headers; ResultData(this.data, this.isSuccess, this.code, {this.headers}); } 

paquete de la API

las solicitudes de gestión centralizada

class Api {
  ///示例请求
  static request(String param) { var params = DataHelper.getBaseMap(); params['param'] = param; return HttpManager.getInstance().get(Address.TEST_API, params); } } 

parámetros públicos y cifrado

class DataHelper{
  static SplayTreeMap getBaseMap() { var map = new SplayTreeMap<String, dynamic>(); map["platform"] = AppConstants.PLATFORM; map["system"] = AppConstants.SYSTEM; map["channel"] = AppConstants.CHANNEL; map["time"] = new DateTime.now().millisecondsSinceEpoch.toString(); return map; } static string2MD5(String data) { var content = new Utf8Encoder().convert(data); var digest = md5.convert(content); return hex.encode(digest.bytes); } } 

Configuración de dirección

gestión de direcciones conveniente

class Address {
  static const String TEST_API = "test_api"; } 

ejemplo de llamada

dardo JSON análisis de json_serializable recomendada, algún otro hoyo, precaución

void request() async { ResultData res = await Api.request("param"); if (res.isSuccess) { //拿到res.data就可以进行Json解析了,这里一般用来构造实体类 TestBean bean = TestBean.fromMap(res.data); }else{ //处理错误 } } 

Demo del Instituto Añadir  https://github.com/po1arbear/Flutter-Net.git



Autor: Phantom Assassin
enlace: https: //www.jianshu.com/p/5ead0cf96642
Fuente: libros de Jane
tienen derechos de autor por el autor. reimpresión comercial póngase en contacto con el autor autorizada, reimpresión no comercial por favor indique la fuente.

Supongo que te gusta

Origin www.cnblogs.com/sundaysme/p/12624185.html
Recomendado
Clasificación