任何在 Objective-C 中使用过 RESTful 服务的人都清楚,与之相关联有很大的样板代码。即使是随着 NSURLSession 的出现,人们仍然需要编写大量类似的代码来从他们的网络服务解析数据。
该项目的目的就是将这些样板代码归纳到单个类中,使您可以将网络请求的所有信息包装成一个单个对象,并使用基于块(block-based)的 API 来加载它。
该项目的主要四个类是 FDHTTPRequest,FDRequestClient,FDRequestClientTask 和 FDURLResponse。
FDHTTPRequest 是一个简单的 NSURLRequest 包装对象。它处理了许多您在尝试创建 HTTP NSURLRequest 时需要编写的常见代码,例如设置头字段、设置查询参数、设置消息体、将消息体转换为 JSON 并设置相应的头字段等。
FDRequestClient 是本项目的核心。它接受 FDHTTPRequest 或 NSURLRequest,提供了一系列用于所有可能发生在请求加载期间的回调的块。
FDRequestClientTask 是 NSURLSessionTask 的包装类。它在请求加载过程中处理收到的所有数据,并提供了一个接口来开始、停止和暂停请求的加载。它还有一个基于块的 API,用于在任务完成加载时通知您。
FDURLResponse 是 NSURLResponse 的包装类。它简化了对您通常在请求结束加载时关注的某些常用信息的访问。
FDRequestClient 支持两种安装方法。两种方法都假设您的 Xcode 项目使用模块。
该项目附带了iOS示例项目,展示了如何使用iOS账户查询Twitter API和GitHub API。
以下是快速展示如何构建针对某个简单HTTP请求的示例。
NSURL *url = [NSURL URLWithString: @"https://api.twitch.tv/kraken/search/games"];
FDHTTPRequest *httpRequest = [[FDHTTPRequest alloc]
initWithURL: url];
[httpRequest setValue: @"Monster Hunter"
forParameter: @"query"];
[httpRequest setValue: @"suggest"
forParameter: @"type"];
[httpRequest setValue: @"true"
forParameter: @"live"];
FDRequestClient *requestClient = [FDRequestClient new];
[requestClient loadHTTPRequest: httpRequest
authorizationBlock: nil
progressBlock: ^(float uploadProgress, float dowloadProgress)
{
NSLog(@"Downloading: %.2f%%", dowloadProgress * 100);
}
dataParserBlock: nil
transformBlock: ^id(id object)
{
id firstResult = nil;
if ([object isKindOfClass: [NSDictionary class]] == YES)
{
firstResult = object[@"games"][0];
}
return firstResult;
}
completionBlock: ^(FDURLResponse *urlResponse)
{
NSLog(@"First Result:\t%@", urlResponse.content);
}];