全部产品

进阶指南

更新时间:2020-08-19 18:48:01

本文对移动网关 RPC 拦截器、RPC 请求头以及 RPC Cookie 的设置进行说明。

RPC 拦截

在业务开发中,如果在某些情况下需要控制客户端的网络请求(拦截网络请求,禁止访问某些接口,或者限流),可以通过 RPC 拦截器实现。

创建全局拦截器

  1. public class CommonInterceptor implements RpcInterceptor {
  2. /**
  3. * 前置拦截:发送 RPC 之前回调。
  4. * @param proxy RPC 代理对象。
  5. * @param clazz rpcface 模型类,通过 clazz 参数可以判断当前调用的是哪个 RPC 模型类
  6. * @param method 当前 RPC 调用的方法。
  7. * @throws RpcException
  8. * @return true 表示继续向下执行,false 表示中断当前请求,抛出 RpcException,错误码:9。
  9. */
  10. @Override
  11. public boolean preHandle(Object proxy,
  12. ThreadLocal<Object> retValue,
  13. byte[] retRawValue,
  14. Class<?> clazz,
  15. Method method,
  16. Object[] args,
  17. Annotation annotation,
  18. ThreadLocal<Map<String, Object>> extParams)
  19. throws RpcException {
  20. //Do something...
  21. return true;
  22. }
  23. /**后置拦截:发起 RPC 成功之后回调。
  24. *@return true 表示继续向下执行,false 表示中断当前请求,抛出 RpcException,错误码:9。
  25. */
  26. @Override
  27. public boolean postHandle(Object proxy,
  28. ThreadLocal<Object> retValue,
  29. byte[] retRawValue,
  30. Class<?> clazz,
  31. Method method,
  32. Object[] args,
  33. Annotation annotation) throws RpcException {
  34. //Do something...
  35. return true;
  36. }
  37. /**
  38. * 异常拦截:发起 RPC 失败之后回调。
  39. * @param exception 表示当前 RPC 出错异常。
  40. * @return true 表示将当前异常继续向上抛出,false 表示不要抛出异常,正常返回,没有特殊需求,切勿返回 false。
  41. */
  42. @Override
  43. public boolean exceptionHandle(Object proxy,
  44. ThreadLocal<Object> retValue,
  45. byte[] retRawValue,
  46. Class<?> clazz,
  47. Method method,
  48. Object[] args,
  49. RpcException exception,
  50. Annotation annotation) throws RpcException {
  51. //Do something...
  52. return true;
  53. }
  54. }

注册拦截器

在框架启动过程中,初始化 RpcService 时,将拦截器注册上去,例如:

  1. public class MockLauncherApplicationAgent extends LauncherApplicationAgent {
  2. public MockLauncherApplicationAgent(Application context, Object bundleContext) {
  3. super(context, bundleContext);
  4. }
  5. @Override
  6. public void preInit() {
  7. super.preInit();
  8. }
  9. @Override
  10. public void postInit() {
  11. super.postInit();
  12. RpcService rpcService = getMicroApplicationContext().findServiceByInterface(RpcService.class.getName());
  13. rpcService.addRpcInterceptor(OperationType.class, new CommonInterceptor());
  14. }
  15. }

设置 RPC 请求头

MainActivity 类的initRpcConfig方法中,设置 RPC 请求头。具体参考 代码示例

  1. private void initRpcConfig(RpcService rpcService) {
  2. //设置请求头
  3. Map<String, String> headerMap = new HashMap<>();
  4. headerMap.put("key1", "val1");
  5. headerMap.put("key2", "val2");
  6. rpcInvokeContext.setRequestHeaders(headerMap);
  7. }

设置 RPC cookie

通过调用以下接口来进行 RPC cookie 设置。其中,Your domain 的规则是网关 url 的第一个 . 及及其后第一个 / 之前的所有内容。例如,网关 URL 为 http://test-cn-hangzhou-mgs-gw.cloud.alipay.com/mgw.htm,那么 Your domain 则是 .cloud.alipay.com

  1. GwCookieCacheHelper.setCookies(Your domain, cookiesMap);

通过调用以下接口即可移除设置的 cookie。

  1. GwCookieCacheHelper.removeAllCookie();