浏览代码

host interceptors

melon.yin 3 年之前
父节点
当前提交
3657c62c9f
共有 3 个文件被更改,包括 108 次插入48 次删除
  1. 13 7
      lib/client_base.dart
  2. 52 0
      lib/interceptor.dart
  3. 43 41
      lib/rpc.dart

+ 13 - 7
lib/client_base.dart

@@ -1,10 +1,11 @@
 import 'dart:convert';
-import 'package:dio/dio.dart';
+import 'package:dio/dio.dart' as dio;
 import 'package:fis_common/http/options.dart';
 import 'package:flutter/foundation.dart';
 
 import 'exception.dart';
 import 'http_pool.dart';
+import 'interceptor.dart';
 import 'request.dart';
 
 /// JSON-RPC Client 基类
@@ -58,7 +59,7 @@ class JsonRpcClientBase {
     var response = await _postRequest(package);
     if (response == null) throw JsonRpcException(message: "Response Empty");
 
-    var result = _handleDecoded(response);
+    var result = await _handleDecoded(response);
     return result;
   }
 
@@ -74,16 +75,21 @@ class JsonRpcClientBase {
             message: "Http error.Status coder: ${response.statusCode}.");
       }
       return response.data;
-    } on DioError catch (e) {
+    } on dio.DioError catch (e) {
       throw JsonRpcException(message: "Http error", data: e);
     }
   }
 
-  dynamic _handleDecoded(Map<String, dynamic> resp) {
-    if (resp.containsKey('error')) {
-      throw JsonRpcServerError.fromJson(resp['error']);
+  Future<dynamic> _handleDecoded(Map<String, dynamic> response) async {
+    final res = await jsonRpcInterceptHost.onResponse(response);
+    if (res.containsKey('error')) {
+      var error = JsonRpcServerError.fromJson(res['error']);
+      error = await jsonRpcInterceptHost.onResponseError(error);
+      throw error;
     }
-    return resp['result'];
+    var result = res['result'];
+    result = await jsonRpcInterceptHost.onResponseResult(result);
+    return result;
   }
 }
 

+ 52 - 0
lib/interceptor.dart

@@ -0,0 +1,52 @@
+import 'exception.dart';
+
+abstract class JsonRpcInterceptor {
+  Future<Map<String, dynamic>> onResponse(Map<String, dynamic> response) async {
+    return response;
+  }
+
+  Future<dynamic> onResponseResult(dynamic result) async {
+    return result;
+  }
+
+  Future<JsonRpcServerError> onResponseError(JsonRpcServerError error) async {
+    return error;
+  }
+}
+
+class _JsonRpcInterceptHost implements JsonRpcInterceptor {
+  final _interceptors = <JsonRpcInterceptor>[];
+
+  void addInterceptor(JsonRpcInterceptor interceptor) {
+    _interceptors.add(interceptor);
+  }
+
+  @override
+  Future<Map<String, dynamic>> onResponse(Map<String, dynamic> response) async {
+    var pipeVal = response;
+    for (var interceptor in _interceptors) {
+      pipeVal = await interceptor.onResponse(pipeVal);
+    }
+    return pipeVal;
+  }
+
+  @override
+  Future<JsonRpcServerError> onResponseError(JsonRpcServerError error) async {
+    var pipeVal = error;
+    for (var interceptor in _interceptors) {
+      pipeVal = await interceptor.onResponseError(pipeVal);
+    }
+    return pipeVal;
+  }
+
+  @override
+  Future onResponseResult(result) async {
+    var pipeVal = result;
+    for (var interceptor in _interceptors) {
+      pipeVal = await interceptor.onResponseResult(pipeVal);
+    }
+    return pipeVal;
+  }
+}
+
+final jsonRpcInterceptHost = _JsonRpcInterceptHost();

+ 43 - 41
lib/rpc.dart

@@ -3,6 +3,7 @@ library fis_jsonrpc;
 import 'dart:collection';
 
 import 'package:fis_common/extensions/type.dart';
+import 'package:fis_jsonrpc/interceptor.dart';
 
 import 'client_base.dart';
 import 'services/index.dart';
@@ -36,6 +37,10 @@ class JsonRpcProxy {
 
   String get defaultAddressSign => _defaultAddressSign;
 
+  /// 添加拦截器
+  void addInterceptor(JsonRpcInterceptor interceptor) =>
+      jsonRpcInterceptHost.addInterceptor(interceptor);
+
   HashMap<Type, dynamic> _serviceCache = HashMap();
 
   static PlatformService? _platformService;
@@ -49,65 +54,63 @@ class JsonRpcProxy {
     return _platformService!;
   }
 
-	AuthenticationService get authentication =>
-	findService(() => new AuthenticationService(currentHostAddress));
-
-	ClientLogService get clientLog =>
-	findService(() => new ClientLogService(currentHostAddress));
+  AuthenticationService get authentication =>
+      findService(() => new AuthenticationService(currentHostAddress));
 
-	ConnectService get connect =>
-	findService(() => new ConnectService(currentHostAddress));
+  ClientLogService get clientLog =>
+      findService(() => new ClientLogService(currentHostAddress));
 
-	DeviceService get device =>
-	findService(() => new DeviceService(currentHostAddress));
+  ConnectService get connect =>
+      findService(() => new ConnectService(currentHostAddress));
 
-	EmailService get email =>
-	findService(() => new EmailService(currentHostAddress));
+  DeviceService get device =>
+      findService(() => new DeviceService(currentHostAddress));
 
-	IdentityApplyService get identityApply =>
-	findService(() => new IdentityApplyService(currentHostAddress));
+  EmailService get email =>
+      findService(() => new EmailService(currentHostAddress));
 
-	LoginService get login =>
-	findService(() => new LoginService(currentHostAddress));
+  IdentityApplyService get identityApply =>
+      findService(() => new IdentityApplyService(currentHostAddress));
 
-	NotificationService get notification =>
-	findService(() => new NotificationService(currentHostAddress));
+  LoginService get login =>
+      findService(() => new LoginService(currentHostAddress));
 
-	OrganizationService get organization =>
-	findService(() => new OrganizationService(currentHostAddress));
+  NotificationService get notification =>
+      findService(() => new NotificationService(currentHostAddress));
 
-	PatientService get patient =>
-	findService(() => new PatientService(currentHostAddress));
+  OrganizationService get organization =>
+      findService(() => new OrganizationService(currentHostAddress));
 
-	PositionService get position =>
-	findService(() => new PositionService(currentHostAddress));
+  PatientService get patient =>
+      findService(() => new PatientService(currentHostAddress));
 
-	RankService get rank =>
-	findService(() => new RankService(currentHostAddress));
+  PositionService get position =>
+      findService(() => new PositionService(currentHostAddress));
 
-	RecordInfoService get recordInfo =>
-	findService(() => new RecordInfoService(currentHostAddress));
+  RankService get rank =>
+      findService(() => new RankService(currentHostAddress));
 
-	RegionService get region =>
-	findService(() => new RegionService(currentHostAddress));
+  RecordInfoService get recordInfo =>
+      findService(() => new RecordInfoService(currentHostAddress));
 
-	RemedicalService get remedical =>
-	findService(() => new RemedicalService(currentHostAddress));
+  RegionService get region =>
+      findService(() => new RegionService(currentHostAddress));
 
-	RoleService get role =>
-	findService(() => new RoleService(currentHostAddress));
+  RemedicalService get remedical =>
+      findService(() => new RemedicalService(currentHostAddress));
 
-	SMSService get sMS =>
-	findService(() => new SMSService(currentHostAddress));
+  RoleService get role =>
+      findService(() => new RoleService(currentHostAddress));
 
-	StorageService get storage =>
-	findService(() => new StorageService(currentHostAddress));
+  SMSService get sMS => findService(() => new SMSService(currentHostAddress));
 
-	UserService get user =>
-	findService(() => new UserService(currentHostAddress));
+  StorageService get storage =>
+      findService(() => new StorageService(currentHostAddress));
 
+  UserService get user =>
+      findService(() => new UserService(currentHostAddress));
 
-    /* 服务代理设置 End */
+  /* 服务代理设置 End */
 
   /// 设置服务主机地址
   void setServerHost(String address) {
@@ -129,4 +132,3 @@ class JsonRpcProxy {
     return _serviceCache[serviceType] as T;
   }
 }
-