本文對移動網關 RPC 攔截器、RPC 請求頭、RPC Cookie、RPC 簽名的設置進行說明。
重要
在 10.2.3 基線中新增設置 RPC 簽名內容。
RPC 攔截
在業務開發中,如果在某些情況下需要控制客戶端的網絡請求(例如攔截網絡請求,禁止訪問某些接口,或者限流),可以通過 RPC 攔截器實現。
創建全局攔截器
public class CommonInterceptor implements RpcInterceptor {
/**
* 前置攔截:發送 RPC 之前回調。
* @param proxy RPC 代理對象。
* @param clazz rpcface 模型類,通過 clazz 參數可以判斷當前調用的是哪個 RPC 模型類
* @param method 當前 RPC 調用的方法。
* @throws RpcException
* @return true 表示繼續向下執行,false 表示中斷當前請求,拋出 RpcException,錯誤碼:9。
*/
@Override
public boolean preHandle(Object proxy,
ThreadLocal<Object> retValue,
byte[] retRawValue,
Class<?> clazz,
Method method,
Object[] args,
Annotation annotation,
ThreadLocal<Map<String, Object>> extParams)
throws RpcException {
//Do something...
return true;
}
/**后置攔截:發起 RPC 成功之后回調。
*@return true 表示繼續向下執行,false 表示中斷當前請求,拋出 RpcException,錯誤碼:9。
*/
@Override
public boolean postHandle(Object proxy,
ThreadLocal<Object> retValue,
byte[] retRawValue,
Class<?> clazz,
Method method,
Object[] args,
Annotation annotation) throws RpcException {
//Do something...
return true;
}
/**
* 異常攔截:發起 RPC 失敗之后回調。
* @param exception 表示當前 RPC 出錯異常。
* @return true 表示將當前異常繼續向上拋出,false 表示不要拋出異常,正常返回,沒有特殊需求,切勿返回 false。
*/
@Override
public boolean exceptionHandle(Object proxy,
ThreadLocal<Object> retValue,
byte[] retRawValue,
Class<?> clazz,
Method method,
Object[] args,
RpcException exception,
Annotation annotation) throws RpcException {
//Do something...
return true;
}
}
注冊攔截器
在框架啟動過程中,初始化 RpcService
時,將攔截器注冊上去,例如:
public class MockLauncherApplicationAgent extends LauncherApplicationAgent {
public MockLauncherApplicationAgent(Application context, Object bundleContext) {
super(context, bundleContext);
}
@Override
public void preInit() {
super.preInit();
}
@Override
public void postInit() {
super.postInit();
RpcService rpcService = getMicroApplicationContext().findServiceByInterface(RpcService.class.getName());
rpcService.addRpcInterceptor(OperationType.class, new CommonInterceptor());
}
}
設置 RPC 請求頭
在 MainActivity
類的 initRpcConfig
方法中,設置 RPC 請求頭。具體參考 代碼示例。
private void initRpcConfig(RpcService rpcService) {
//設置請求頭
Map<String, String> headerMap = new HashMap<>();
headerMap.put("key1", "val1");
headerMap.put("key2", "val2");
rpcInvokeContext.setRequestHeaders(headerMap);
}
設置 RPC cookie
設置 cookie
通過調用以下接口來進行 RPC cookie 設置。其中,Your domain
的規則是網關 URL 的第一個 .
以及其后第一個 /
之前的所有內容。例如,網關 URL 為 http://test-cn-hangzhou-mgs-gw.cloud.alipay.com/mgw.htm
,那么 Your domain
則是 .cloud.alipay.com
。
GwCookieCacheHelper.setCookies(Your domain, cookiesMap);
移除 cookie
通過調用以下接口即可移除設置的 cookie。
GwCookieCacheHelper.removeAllCookie();
設置 SM3 驗簽
在 RPC 初始化之后,可以通過MPRpc
類的 setGlobalSignType
方法,來指定全局驗簽方式為 sm3 類型。
MPRpc.setGlobalSignType(TransportConstants.SIGN_TYPE_SM3);
設置 RPC 簽名
接口
class TransportConstants {
public static final int SIGN_TYPE_DEFAULT = 0; // 默認簽名方式,即 md5
public static final int SIGN_TYPE_MD5 = 1; // md5
public static final int SIGN_TYPE_HMACSHA256 = 3; // hmacsha256
public static final int SIGN_TYPE_SHA256 = 4; // sha256
public static final int SIGN_TYPE_SM3 = 5; // sm3
}
// 全局 rpc 簽名算法設置
MPRpc.setGlobalSignType(int signType);
示例
設置全局 RPC signType,且對所有 RPC 生效。
// 設置簽名方式為SM3
MPRpc.setGlobalSignType(TransportConstants.SIGN_TYPE_SM3);
文檔內容是否對您有幫助?