request.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import 'dart:io';
  2. import 'package:bot_toast/bot_toast.dart';
  3. import 'package:dio/dio.dart';
  4. import 'package:dio/adapter.dart';
  5. import 'package:twong/api/index.dart';
  6. import '../utils/index.dart';
  7. import '../models/index.dart';
  8. enum RequestType {
  9. GET, POST
  10. }
  11. class RequestData {
  12. final String api;
  13. final dynamic data;
  14. final RequestType type;
  15. RequestData(this.type, this.api, this.data);
  16. }
  17. class Request {
  18. static Dio _dio;
  19. static RequestData _lastRequest;
  20. static const String update_url = "https://qndownload.shotshock.shop/version";
  21. // init network
  22. static void init() {
  23. _dio = Dio(BaseOptions(
  24. sendTimeout: 15000,
  25. receiveTimeout: 15000,
  26. connectTimeout: 15000,
  27. // baseUrl: "http://twong.h/api/",
  28. // baseUrl: "https://twong.shotshock.shop/api/",
  29. baseUrl: "http://81.70.81.74:30007/api/",
  30. headers: {}));
  31. (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
  32. (client) {
  33. client.badCertificateCallback =
  34. (X509Certificate cert, String host, int port) {
  35. return true;
  36. };
  37. };
  38. updateToken();
  39. }
  40. // update token
  41. static void updateToken() {
  42. var token = Cache.token;
  43. if(token == null) {
  44. Request.setHeader("Authori-zation", null);
  45. } else {
  46. Request.setHeader("Authori-zation", "Bearer ${token?.token}");
  47. }
  48. }
  49. // set http header
  50. static void setHeader(String key, String value) {
  51. _dio.options.headers[key] = value;
  52. }
  53. // http get request with full url
  54. static Future<Response> getWithUrl(String url, {Map<String, dynamic> params}) async {
  55. return Dio().get(url, queryParameters: params);
  56. }
  57. // http post request with full url
  58. static Future<Response> postWithUrl(String url, {Map<String, dynamic> params}) async {
  59. return Dio().post(url, queryParameters: params);
  60. }
  61. // get remote version
  62. static Future<Version> getVersion() async {
  63. var response = await getWithUrl("$update_url?ts=${DateTime.now().millisecondsSinceEpoch}");
  64. var version = Version.fromJson(response.data);
  65. return version;
  66. }
  67. // base HTTP GET
  68. static Future<dynamic> get(String uri, {Map<String, dynamic> params}) async {
  69. try {
  70. _lastRequest = RequestData(RequestType.GET, uri, params);
  71. // var response = await _dio.get(uri, queryParameters: params);
  72. // var response = await compute(_request, RequestData(_dio, "GET", uri, data: params));
  73. // var data = Resp.fromJson(response.data);
  74. var data = await _processRequestData(_lastRequest);
  75. return Future.value(process(data));
  76. } on DioError catch (err) {
  77. Log.e("DioError: $err URL: ${_dio.options.baseUrl}$uri");
  78. throw NetError("网络错误!");
  79. }
  80. }
  81. // base HTTP POST
  82. static Future<dynamic> post(String uri, {Map<String, dynamic> params}) async {
  83. try {
  84. _lastRequest = RequestData(RequestType.POST, uri, params);
  85. // var response = await _dio.post(uri, queryParameters: params);
  86. // var response = await compute(_request, RequestData(_dio, "POST", uri, data: params));
  87. var data = await _processRequestData(_lastRequest);
  88. return Future.value(process(data));
  89. } on DioError catch (err) {
  90. Log.e("DioError: $err URL: ${_dio.options.baseUrl}$uri");
  91. throw NetError("网络错误!");
  92. }
  93. }
  94. static Future<Resp> _processRequestData(RequestData request) async {
  95. var resp;
  96. if(request.type == RequestType.GET) {
  97. Log.i("GET | ${request.api} " + (request.data == null ? "" : request.data.toString()));
  98. var response = await _dio.get(request.api, queryParameters: request.data);
  99. resp = Resp.fromJson(response.data);
  100. } else if(request.type == RequestType.POST) {
  101. Log.i("POST | ${request.api} " + (request.data == null ? "" : request.data.toString()));
  102. var response = await _dio.post(request.api, queryParameters: request.data);
  103. resp = Resp.fromJson(response.data);
  104. }
  105. return resp;
  106. }
  107. // process http response data
  108. static dynamic process(Resp response) async {
  109. Log.i("rsp | ${response.msg} ${response.status}");
  110. if([410000, 410001, 410002].contains(response.status)) {
  111. var request = _lastRequest;
  112. var resp = await Network.inst.autoLogin();
  113. if(resp == null){
  114. Utils.toLogin();
  115. BotToast.showText(text: response.msg);
  116. throw NetError(response.msg);
  117. }
  118. if(request != null) {
  119. response = await _processRequestData(request);
  120. Log.i("rsp | ${response.msg} ${response.status}");
  121. }
  122. }
  123. if (response.status != 200) {
  124. Log.e("response ${response.toJson()}}");
  125. BotToast.showText(text: response.msg);
  126. throw NetError(response.msg);
  127. }
  128. return response.data;
  129. }
  130. }