初始化框架
在使用 RPC 之前,需先初始化 mPaaS 框架:
export default class EntryAbilityStage extends AbilityStage {
async onCreate() {
const app = this.context;
MPFramework.create(app);
const instance: MPFramework = MPFramework.instance;
const ctx: Context = instance.context
}
}
生成 RPC 代碼
以下代碼由控制臺自動生成,若尚未升級控制臺,可以手動按以下格式輸入模型,如:VipInfo.ts
。
interface VipInfo{
expireTime:number,
level:number
}
模型中可以包含模型,如:userInfo.ts
。
interface UserInfo{
vip:VipInfo,
name:string,
age:number
}
包裝參數由控制臺自動生成,如:LoginPostReq.ts
。
interface LoginPostReq{
_mPaaSCustomBody:UserInfo
}
自動生成接口,如尚未升級控制臺,可以先手動配置。以 Client.ets
為例。
import {MPRpc} from '@mpaas/rpc'
class Client{//<>中為返回值類型,needsign,ispb為必傳字段
async loginPost(req:LoginPostReq):Promise<string>{//返回類型為string
return MPRpc.executeRpc<string>(this,{
operationType:"com.antcloud.request.post",
needSign:false,
isPb:false
},req);
}
}
調用 RPC 接口
RPC 請求必須在子線程調用,可使用中間層中 MPRpcInterface
封裝的子線程調用接口,回調方法默認為主線程。示例代碼如下:
//前提條件初始化rpc
MPRpc.init();
function testRpc(){
let cl = new Client();
let account:VipInfo = {
expireTime:1,
level:1
};
let user:UserInfo = {
vip:account,
name:"handsome",
age:14
}
let req:LoginPostReq ={
_mPaaSCustomBody:user
}
cl.loginPost(req).then((result)=>{
console.log("result")
}).catch((e:Error)=>{
console.log(e.message)//通過e.message可以拿到具體的報錯原因
});
}
要使用 try catch
捕獲異常,當網關異常時就會拋出,您可以根據 網關結果碼說明 查詢原因。
請求自定義配置
設置超時時間
添加 timeout
配置,代碼如下:
import {MPRpc} from '@mpaas/rpc'
class Client{//<>中為返回值類型,needsign,ispb為必傳字段
async loginPost(req:UserInfo):Promise<string>{
return MPRpc.executeRpc<string>(this,{
operationType:"com.antcloud.request.post",
needSign:false,
isPb:false,
timeout:1000000//設置超時時間,默認為1分鐘
},req);
}
}
設置請求 URL
添加 URL 配置,代碼如下:
import {MPRpc} from '@mpaas/rpc'
class Client{//<>中為返回值類型,needsign,ispb為必傳字段
async loginPost(req:UserInfo):Promise<string>{
return MPRpc.executeRpc<string>(this,{
operationType:"com.antcloud.request.post",
needSign:false,
isPb:false,
url:"https://xxxx.xx/xx/"http://設置請求 URL。默認為網關地址
},req);
}
}
設置請求 Header
添加 Header 配置,代碼如下:
import {MPRpc} from '@mpaas/rpc'
//初始化header
let headers:Map<string,string> = new Map();
headers.set("key1","value1");
headers.set("key2","value2");
class Client{//<>中為返回值類型,needsign,ispb為必傳字段
async loginPost(req:UserInfo):Promise<string>{
return MPRpc.executeRpc<string>(this,{
operationType:"com.antcloud.request.post",
needSign:false,
isPb:false,
header:headers //設置headers
},req);
}
}
自定義 RPC 攔截器
初始化攔截器。
preHandle
在請求前執行,參數返回RpcInvokeContext
對象,可以進行 Header,URL,timeout 等操作,return false
表示進行攔截,rpc 接口可以 catch 異常,請求將終止。postHandle
在請求后執行,參數返回RpcInvokeContext
對象,可以獲取response header
等操作,return false
表示進行攔截,rpc 接口可以 catch 異常,請求將終止。handleException
,表示遇到異常時進行攔截。
import {RpcInterceptor,RpcInvokeContext} from "@mpaas/rpc"; class interceptor implements RpcInterceptor{ preHandle(rpcInvokeContext: RpcInvokeContext): boolean { return true; } postHandle(rpcInvokeContext: RpcInvokeContext): boolean { return true; } handleException(rpcInvokeContext: RpcInvokeContext, exception: RPCException) { throw exception; } }
配置攔截器。
攔截指定 RPC。
在自動生成的代碼中添加
interceptor
配置:import {MPRpc} from '@mpaas/rpc' import {RpcInterceptor,RpcInvokeContext} from "@mpaas/rpc"; class interceptor implements RpcInterceptor{ preHandle(rpcInvokeContext: RpcInvokeContext): boolean { return true; } postHandle(rpcInvokeContext: RpcInvokeContext): boolean { return true; } handleException(rpcInvokeContext: RpcInvokeContext, exception: RPCException) { throw exception; } } class Client{//<>中為返回值類型,needsign,ispb為必傳字段 async loginPost(req:UserInfo):Promise<string>{ return MPRpc.executeRpc<string>(this,{ operationType:"com.antcloud.request.post", needSign:false, isPb:false, interceptor:new interceptor() },req); } }
設置全局攔截。
在
MPRpc
接口中設置:import {RpcInterceptor,RpcInvokeContext} from "@mpaas/rpc"; import {MPRpc} from '@mpaas/rpc' class interceptor implements RpcInterceptor{ preHandle(rpcInvokeContext: RpcInvokeContext): boolean { return true; } postHandle(rpcInvokeContext: RpcInvokeContext): boolean { return true; } handleException(rpcInvokeContext: RpcInvokeContext, exception: RPCException) { throw exception; } } MPRpc.addGlobalInterceptor(new interceptor());
數據加密
在 rawfile
目錄下添加 mpaasnetconfig.json
文件。其中:
type
:加密類型,支持 ECC/RSA/SM2。crypt
: 是否開啟加密。gw
:使用螞蟻自研 gzip,必須設置為true
。pubKey
:公鑰,需與加密類型匹配。gwList
:支持加密的 URL,多個 URL 可以用,
分割,只有命中 URL 的才會參與加密。
{
"type": "ECC",//支持ECC/RSA/SM2
"crypt": false,//是否開啟加密
"gw": true,//使用螞蟻自研 gzip
"pubKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEx796auKwF42leWWX/cwvffrvz/M2\nd6f4ovv4G7wmu45Ed+5WBDfp7vKHB0P3il4SXmvK6be6m1MhL2kkY8Kj0Q==\n-----END PUBLIC KEY-----",
"gwList":"https://mgw.mpaas.cn-hangzhou.aliyuncs.com/mgw.htm,http://11.164.247.80/mgw.htm"
}
數據簽名(臨時方案)
在接口文件中進行配置,needSign
設置為 true
,sec
中設置 appsecret
,signType
中設置簽名類型,目前支持:MD5(type 為 0),SHA256(type 為 4), SHA1(type 為 1)。
import {MPRpc} from '@mpaas/rpc'
class Client{//<>中為返回值類型,needsign,ispb為必傳字段
async loginPost(req:UserInfo):Promise<string>{
return MPRpc.executeRpc<string>(this,{
operationType:"com.antcloud.request.post",
needSign:true,(默認為false)
isPb:false,
sec:"sss",
signType:0 //如果不填,默認值為0 md5 (默認不填為md5)
},req);
}
}
數據簽名(安全圖片)
在接口文件中進行配置,needSign
設置為 true
,signType
中設置簽名類型,目前支持:MD5(type 為 0),SHA256(type 為 4), SM3(type 為 5)。
生成安全圖片
當前版本尚未提供自動化工具,需客戶提供相關信息,由 mPaaS 方幫助生成。需要提供的信息包括 appId、workspaceId、應用包名、appsecret 和 應用簽名 fingerPrint。
其中 fingerPrint 可以通過鴻蒙官方接口獲取,建議接入方使用統一簽名,否則針對不同簽名需要生成不同的圖片。
獲取 fingerPrint 的接口如下:
import bundleManager from '@ohos.bundle.bundleManager';
let info = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO);
let finger = info.signatureInfo.fingerprint;
獲得安全圖片后,將其放在 rawfile 目錄下即可。
針對全局
可以設置全局
secret
。MPFramework.instance.appSecret = "xxxxxx"
可以利用全局攔截器進行設置。
import {RpcInterceptor,RpcInvokeContext} from "@mpaas/rpc"; import {MPRpc} from '@mpaas/rpc' class interceptor implements RpcInterceptor{ preHandle(rpcInvokeContext: RpcInvokeContext): boolean { rpcInvokeContext.setNeedSign(true); rpcInvokeContext.setSignType(0); rpcInvokeContext.setSecret("xxxx"); return true; } postHandle(rpcInvokeContext: RpcInvokeContext): boolean { return true; } handleException(rpcInvokeContext: RpcInvokeContext, exception: RPCException) { throw exception; } } MPRpc.addGlobalInterceptor(new interceptor());