SVHTTPRequest让您轻松与RESTful(GET、POST、DELETE、PUT)Web API交互。它是基于阻塞的,使用NSURLConnection
、ARC以及NSJSONSerialization
来自动解析JSON响应。
SVHTTPRequest特色功能:
GET
、POST
、PUT
、DELETE
、HEAD
和下载请求。response
(JSON则返回NSObject
,否则返回NSData
)、NSHTTPURLResponse
和NSError
对象。SVHTTPClient
时支持持久basePath
和基本身份验证签名。multipart/form-data
参数。如果你的项目不使用ARC:你必须将-fobjc-arc
编译器标志添加到Target Settings > Build Phases > Compile Sources中的SVHTTPRequest.m
和SVHTTPClient.m
文件中。
SVHTTPRequest/SVHTTPRequest
文件夹拖动到你的项目中。#import "SVHTTPRequest.h"
(这将同时导入SVHTTPClient
)(见/Demo
中的示例Xcode项目)
执行请求的最简单方法是使用SVHTTPRequest
的便利方法
[SVHTTPRequest GET:@"https://api.github.com/repos/samvermette/SVHTTPRequest"
parameters:nil
completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
watchersLabel.text = [NSString stringWithFormat:@"SVHTTPRequest has %@ watchers", [response valueForKey:@"watchers"]];
}];
如果您的请求大多数都是针对同一API端点,则建议使用SVHTTPClient
,这样您可以设置将用于每个请求的参数(basePath
、cachePolicy
、sendParametersAsJSON
、"userAgent"
等)
[[SVHTTPClient sharedClient] setBasePath:@"http://api.twitter.com/1/"];
[[SVHTTPClient sharedClient] GET:@"users/show.json"
parameters:[NSDictionary dictionaryWithObject:@"samvermette" forKey:@"screen_name"]
completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
followersLabel.text = [NSString stringWithFormat:@"@samvermette has %@ followers", [response valueForKey:@"followers_count"]];
}];
您可以使用sharedClientWithIdentifier:
方法创建多个SVHTTPClient实例。
如果您想针对单个请求设置这些属性,您将需要分配并初始化请求,设置属性,然后调用start
SVHTTPRequest *request = [[SVHTTPRequest alloc] initWithAddress:@"http://github.com/api/v2/json/repos/show/samvermette/SVHTTPRequest"
method:SVHTTPRequestMethodGET
parameters:nil
completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
watchersLabel.text = [NSString stringWithFormat:@"SVHTTPRequest has %@ watchers", [[response valueForKey:@"repository"] valueForKey:@"watchers"]];
}];
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
[request start];
您可以让SVHTTPRequest将GET响应直接保存到磁盘,并沿途跟踪进度
[SVHTTPRequest GET:@"http://example.com/db.sqlite.zip"
parameters:nil
saveToPath:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"store.zip"]
progress:^(float progress) {
progressLabel.text = [NSString stringWithFormat:@"Downloading (%.0f%%)", progress*100];
}
completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
progressLabel.text = @"Download complete";
// process file
}];
请确保取消那些用户不再等待的请求
SVHTTPRequest *request = [SVHTTPRequest GET:@"http://api.twitter.com/1/users/show.json"
parameters:[NSDictionary dictionaryWithObject:@"samvermette" forKey:@"screen_name"]
completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
NSLog(@"%@", response);
}];
[request cancel];
如果您正在使用SVHTTPClient,您可以通过调用cancelRequestsWithPath:
或cancelAllRequests
来执行此操作。
默认情况下,SVHTTPRequest会在发送每个请求时将消息记录到控制台。您可以通过向目标设置>构建阶段的SVHTTPRequest.m中添加编译器标志-DSVHTTPREQUEST_DISABLE_LOGGING
来禁用此功能。
所有SVHTTPRequest请求都是异步通过NSURLConnection内置的异步方法发出的。但是,完成块是在主线程上执行的。如果它足够耗资源以至于占用主线程,则应将其分派到单独的线程/队列。这可以通过使用Grand Central Dispatch轻松完成。
completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// cpu-intensive code
});
}];
SVHTTPRequest由Sam Vermette和参与项目的贡献者提供。如果您有功能建议或错误报告,请通过发送pull请求或通过创建新问题来帮助解决。如果在您的项目中使用SVHTTPRequest,说明出处会很好。