使用 SDK

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

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

  1. 初始化网关服务

  2. 生成 RPC 代码

  3. 发送请求

  4. 请求自定义配置

  5. 自定义 RPC 拦截器

  6. 数据加密

初始化网关服务

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

[MPRpcInterface initRpc];

旧版本升级注意事项

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

gateway

生成 RPC 代码

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

generate code

下载的 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 请求的方法名、参数、返回类型等信息。

  • 如果发送请求时,不需要加签,可以将 DTRpcMethodsignCheck 属性设置为 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:@[ ]];
    }
  • 如果需要设置超时时间,可以配置 DTRpcMethodtimeoutInterval 属性。

    -(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 提供多种数据加密配置功能,详情参考 数据加密

相关链接

阿里云首页 移动开发平台 mPaaS 相关技术圈