DDWebService 2.0.4

DDWebService 2.0.4

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2017年12月

llg 维护。



  • 作者
  • llg

DDWebService 基于集约型封装的离散型框架

1、网络层现有架构模式:离散型、集约型

(1)离散型介绍:

离散型 API 调用是这样的,一个 API 对应于一个 RequestTask,然后这个 RequestTask 只需要提供参数就能起飞,API 名称、着陆方式都已经集成入 RequestTask 中。离散型 API 调用方式:

@property (nonatomic, strong) HMBaseRequestTask *requestTask; // getter

  • (HMBaseRequestTask *)requestTask {
    if (_requestTask == nil) {
    _requestTask = [[HMBaseRequestTask alloc] init];
    _requestTask = self;
    }
    return _requestTask;
    }
    // 使用时就这么写:
    [requestTask load];

(2)集约型介绍:

API 调用其实就是所有 API 的调用只有一个类,然后这个类接收 API 名称、API 参数以及回调着陆点(可以是 target-action,或者 block,或者 delegate 等各种模式的着陆点)作为参数。然后执行类似 startRequest 这样的方法,它就会去根据这些参数起飞去调用 API 了,然后获得 API 数据之后再根据指定的着陆点去着陆。集约型 API 调用方式:

[APIRequest startRequestWithApiName:@"itemList.v1" params:params success:@selector(success:) fail:@selector(fail:) target:self];

(3)集约型与离散型对比

集约型 API 调用和离散型 API 调用这两者的实现方案不是互斥的,单看下层,大家都是集约型。因为发起一个 API 请求之后,除去业务相关的部分(比如参数和 API 名称等),剩下的都是要统一处理的:加密、URL 拼接、API 请求的起飞和着陆。然而对于整个网络层来说,尤其是业务方使用的那部分,我倾向于提供离散型的 API 调用方式,并不建议在业务层的代码直接使用集约型的 API 调用方式。原因如下:

原因1:离散型的 API 使用可以让使用者更多时间去关心业务,不必关心 API 是怎么实现的。因为离散型 API 会把 url、请求的 method、必要的参数封装在 RequestTask 中,对外只需要暴露业务相关参数即可,使用者只需要关心业务。而集约型 API 设计还需要使用方知道请求的 API、请求方式

原因2:便于针对某个 API 请求来进行 AOP。

原因3:离散型的 API 更易于管理请求的发起和取消等操作,一个 RequestTask 封装一个 API,使用相关的 Task 取消即可。

原因4:离散型的 API 调用方式能够最大限度地给业务方提供灵活性。比如根据不同的 api 是否使用缓存、翻页机制、参数校验,在离散型的 requestTask 里面实现就会非常轻松。

综上所述,关于集约型的 API 调用和离散型的 API 调用,我倾向于这样:对外提供一个 BaseRequestTask 来给业务方做派生,在 Client 里采用集约化的手段组装请求,放飞请求,然后业务方调用 API 的时候,则是以离散的 API 调用方式来调用。

2、案例

(1)GET 请求,(其他请求类似,只不过更改配置参数)

创建一个请求 eg HMGetRequestTask

@implementation HMGetRequestTask

#pragma mark - Common config

  • (NSURL *)baseUrl {

      return [NSURL URLWithString:@"http://www.baidu.com"];
    

}

  • (NSString *)apiName {

    return @"user.json";

}

  • (NSString *)apiVersion {

    return @"0.0";

}

  • (WSHTTPMethod)requestMethod { return WSHTTPMethodGET; }

  • (WSRequestContentType)requestSerializerType {

return WSRequestContentTypeJson; }

  • (WSHTTPBodyJsonType)bodyJsonType { return WSHTTPBodyJsonTypeDictionary; }

  • (WSResponseMIMEType)responseSerializerType { return WSResponseMIMETypeJson; }

#pragma mark - Parameter

  • (NSError *)validLocalHeaderField{ return nil; }

  • (void)configureHeaderField{ }

  • (NSError *)validLocalParameterField{ return nil; }

  • (void)configureParameterField{

}

#pragma mark - response validator

  • (NSError *)cumstomResposeRawObjectValidator { 处理解析返回的数据 return nil; }

#pragma mark - 错误处理

  • (void)handleError:(NSError *)error {

错误处理

}

使用时只需引入HMGetRequestTask.h创建一个请求,发起后等待回收即可

HMGetRequestTask *task = [[HMGetRequestTask alloc] init];

[task loadWithComplateHandle:^(WSRequestTask *request, BOOL isLocalResult, NSError *error) {

回调结束处理

}];