离散型 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];
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];
集约型 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 调用方式来调用。
创建一个请求 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
#pragma mark - 错误处理
错误处理
}
使用时只需引入HMGetRequestTask.h创建一个请求,发起后等待回收即可
HMGetRequestTask *task = [[HMGetRequestTask alloc] init];
[task loadWithComplateHandle:^(WSRequestTask *request, BOOL isLocalResult, NSError *error) {
回调结束处理
}];