RPC 相关模块为 APMobileNetwork.framework、MPMgsAdapter,推荐使用 MPMgsAdapter 中的接口。

本文引导您通过以下步骤使用移动网关 SDK:

  1. 初始化网关服务

  2. 生成 RPC 代码

  3. 发送请求

  4. 请求自定义配置

  5. 自定义 RPC 拦截器

  6. 数据加密

  7. 数据签名

初始化网关服务

调用以下方法初始化网关服务:

[MPRpcInterface initRpc];

旧版本升级注意事项

10.1.32 版本之后不再需要添加 DTRpcInterface类的 Category文件,中间层会实现包装从 meta.config中读取,升级版本后请检查工程中是否存在旧版本配置,如果有请移除。下面为新版本应移除的 DTRpcInterface类的 Category文件。

gateway

生成 RPC 代码

当 App 在移动网关控制台接入后台服务后,即可下载客户端的 RPC 代码。更多信息请参考 生成代码

下载的 RPC 代码结构如下:

code structure

其中:

  • RPCDemoCloudpay_accountClient为 RPC 配置。

  • RPCDemoAuthLoginPostReq为 request 模型。

  • RPCDemoLoginResult为 response 模型。

发送请求

RPC 请求必须在子线程调用,可使用中间层中 MPRpcInterface封装的子线程调用接口,回调方法默认为主线程。示例代码如下:

- (void)sendRpc
{
    __block RPCDemoLoginResult *result = nil;
    [MPRpcInterface callAsyncBlock:^{
        @try
        {
            RPCDemoLoginRequest *req = [[RPCDemoLoginRequest alloc] init];
            req.loginId = @"alipayAdmin";
            req.loginPassword = @"123456";
            RPCDemoAuthLoginPostReq *loginPostReq = [[RPCDemoAuthLoginPostReq alloc] init];
            loginPostReq._requestBody = req;
            RPCDemoCloudpay_accountClient *service = [[RPCDemoCloudpay_accountClient alloc] init];
            result = [service authLoginPost:loginPostReq];
        }
        @catch (NSException *exception) {
            NSLog(@"%@", exception);
            NSError *error = [userInfo objectForKey:@"kDTRpcErrorCauseError"];        // 获取异常详细信息
            NSInteger code = error.code;        // 获取异常详细信息错误码
        }
    } completion:^{
        NSString *str = @"";
        if (result && result.success) {
            str = @"登录成功";
        } else {
            str = @"登录失败";
        }

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:str message:nil delegate:nil
                                              cancelButtonTitle:nil otherButtonTitles:@"ok", nil];
        [alert show];
    }];
}
说明

要使用 try catch捕获异常;当网关异常时会抛出,根据 网关结果码说明 查询原因。

请求自定义配置

DTRpcMethod为 RPC 请求方法描述,记录 RPC 请求的方法名、参数、返回类型等信息。

  • 如果发送请求时,不需要加签,可以将 DTRpcMethod的 signCheck属性设置为 NO。

    -(MPDemoUserInfo *) dataPostSetTimeout:(MPDemoPostPostReq *)requestParam
    {
      DTRpcMethod *method = [[DTRpcMethod alloc] init];
      method.operationType = @"com.antcloud.request.post";
      method.checkLogin =  NO ;
      method.signCheck =  NO ;
      method.returnType =   @"@\"MPDemoUserInfo\"";
    
      return [[DTRpcClient defaultClient] executeMethod:method params:@[ ]];
    }
  • 如果需要设置超时时间,可以配置 DTRpcMethod的 timeoutInterval属性。

    -(MPDemoUserInfo *) dataPostSetTimeout:(MPDemoPostPostReq *)requestParam
    {
      DTRpcMethod *method = [[DTRpcMethod alloc] init];
      method.operationType = @"com.antcloud.request.post";
      method.checkLogin =  NO ;
      method.signCheck =  YES ;
       method.timeoutInterval = 1;     // 这个超时时间是客户端收到网关返回的时间,服务端配置的超时时间是后端业务系统的返回时间;默认 20s,设置小于 1 时无效即为默认值
      method.returnType =   @"@\"MPDemoUserInfo\"";
    
      return [[DTRpcClient defaultClient] executeMethod:method params:@[ ]];
    }
  • 如果需要为接口添加 Header,可以使用下面 DTRpcClient的扩展方法。

    -(MPDemoUserInfo *) dataPostAddHeader:(MPDemoPostPostReq *)requestParam
    {
      DTRpcMethod *method = [[DTRpcMethod alloc] init];
      method.operationType = @"com.antcloud.request.postAddHeader";
      method.checkLogin =  NO ;
      method.signCheck =  YES ;
      method.returnType =   @"@\"MPDemoUserInfo\"";
    
      // 针对接口添加 header
      NSDictionary *customHeader = @{@"testKey": @"testValue"};
      return [[DTRpcClient defaultClient] executeMethod:method params:@[ ] requestHeaderField:customHeader responseHeaderFields:nil];
    }
  • 如果需要为所有接口添加 Header,可以参考下方拦截器的使用,采用拦截器的方式实现。具体实现方法请参考移动网关 代码示例

  • checkLogin属性为接口 session校验使用,需要配合网关控制台完成,默认设置为 NO 即可。

自定义 RPC 拦截器

基于业务需求,可能需要在 RPC 发送前,或 RPC 处理完成后进行相关逻辑处理,RPC 模块提供拦截器机制处理此类需求。

自定义拦截器

创建拦截器,并实现 <DTRpcInterceptor>协议的方法,用来处理 RPC 请求前后的相关操作。

@interface HXRpcInterceptor : NSObject<DTRpcInterceptor>

@end

@implementation HXRpcInterceptor

- (DTRpcOperation *)beforeRpcOperation:(DTRpcOperation *)operation{
    // TODO
    return operation;
}

- (DTRpcOperation *)afterRpcOperation:(DTRpcOperation *)operation{
   // TODO
   return operation;
}
@end

注册拦截器

您可通过调用中间层的扩展接口,在拦截器容器中注册自定义的子拦截器。

    HXRpcInterceptor *mpTestIntercaptor = [[HXRpcInterceptor alloc] init];    // 自定义子拦截器
    [MPRpcInterface addRpcInterceptor:mpTestIntercaptor];

数据加密

RPC 提供多种数据加密配置功能,详情参考 数据加密

数据签名(10.2.3 支持)

10.2.3 基线 RPC 提供多种数据签名配置功能。10.2.3 基线升级了无线保镖SDK,支持国密签名,升级后使用本基线需要更换无线保镖图片为 V6 版本。

10.1.68 基线默认为 V5 版本,请按照下列步骤使用插件生成 V6 图片,并替换工程中原有的 yw_1222.jpg无线保镖图片。

  1. 安装 mPaaS 命令行工具(命令行工具包在了插件安装中,去除 Xcode 签名可设置 N)。

  2. 使用下列命令行,生成新的无线保镖图片。

    mpaas inst sgimage -c /path/to/Ant-mpaas-0D4F511111111-default-IOS.config -V 6 -t 1 -o /path/to/output --app-secret sssssdderrff --verbose
    说明

    其中 config 文件目录、目标文件目录、appsecret 参数说明请替换成实际值。

  3. 如需无线保镖支持国密功能,请按照下面代码配置 category 代码设置签名算法,默认不配置时是 MPAASRPCSignTypeDefault,签名算法为 MD5。

    签名算法可选值如下:

    • MD5:MPAASRPCSignTypeDefault(默认)

    • SHA256:MPAASRPCSignTypeSHA256

    • HMACSHA256:MPAASRPCSignTypeHMACSHA256

    • SM3:MPAASRPCSignTypeSM3

    代码示例:

    #import <APMobileNetwork/DTRpcInterface.h>
    
    @interface DTRpcInterface (mPaaSDemo)
    
    @end
    
    @implementation DTRpcInterface (mPaaSDemo)
    
    - (MPAASRPCSignType)customRPCSignType
    {
        return MPAASRPCSignTypeSM3;
    }
    
    @end

相关链接