-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
RKClient.m
234 lines (188 loc) · 7.69 KB
/
RKClient.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
//
// RKClient.m
// RestKit
//
// Created by Blake Watters on 7/28/09.
// Copyright 2009 Two Toasters. All rights reserved.
//
#import "RKClient.h"
#import "RKObjectLoader.h"
#import "RKURL.h"
#import <SystemConfiguration/SCNetworkReachability.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Global
static RKClient* sharedClient = nil;
///////////////////////////////////////////////////////////////////////////////////////////////////
// URL Conveniences functions
NSURL* RKMakeURL(NSString* resourcePath) {
return [[RKClient sharedClient] URLForResourcePath:resourcePath];
}
NSString* RKMakeURLPath(NSString* resourcePath) {
return [[RKClient sharedClient] URLPathForResourcePath:resourcePath];
}
NSString* RKMakePathWithObject(NSString* path, id object) {
NSMutableDictionary* substitutions = [NSMutableDictionary dictionary];
NSScanner* scanner = [NSScanner scannerWithString:path];
BOOL startsWithParentheses = [[path substringToIndex:1] isEqualToString:@"("];
while ([scanner isAtEnd] == NO) {
NSString* keyPath = nil;
if (startsWithParentheses || [scanner scanUpToString:@"(" intoString:nil]) {
// Advance beyond the opening parentheses
if (NO == [scanner isAtEnd]) {
[scanner setScanLocation:[scanner scanLocation] + 1];
}
if ([scanner scanUpToString:@")" intoString:&keyPath]) {
NSString* searchString = [NSString stringWithFormat:@"(%@)", keyPath];
NSString* propertyStringValue = [NSString stringWithFormat:@"%@", [object valueForKeyPath:keyPath]];
[substitutions setObject:propertyStringValue forKey:searchString];
}
}
}
if (0 == [substitutions count]) {
return path;
}
NSMutableString* interpolatedPath = [[path mutableCopy] autorelease];
for (NSString* find in substitutions) {
NSString* replace = [substitutions valueForKey:find];
[interpolatedPath replaceOccurrencesOfString:find
withString:replace
options:NSLiteralSearch
range:NSMakeRange(0, [interpolatedPath length])];
}
return [NSString stringWithString:interpolatedPath];
}
///////////////////////////////////////////////////////////////////////////////////////////////////
@implementation RKClient
@synthesize baseURL = _baseURL;
@synthesize username = _username;
@synthesize password = _password;
@synthesize HTTPHeaders = _HTTPHeaders;
@synthesize baseURLReachabilityObserver = _baseURLReachabilityObserver;
@synthesize serviceUnavailableAlertTitle = _serviceUnavailableAlertTitle;
@synthesize serviceUnavailableAlertMessage = _serviceUnavailableAlertMessage;
@synthesize serviceUnavailableAlertEnabled = _serviceUnavailableAlertEnabled;
+ (RKClient*)sharedClient {
return sharedClient;
}
+ (void)setSharedClient:(RKClient*)client {
[sharedClient release];
sharedClient = [client retain];
}
// Deprecated
+ (RKClient*)client {
return sharedClient;
}
// Deprecated
+ (void)setClient:(RKClient*)client {
[sharedClient release];
sharedClient = [client retain];
}
+ (RKClient*)clientWithBaseURL:(NSString*)baseURL {
RKClient* client = [[[RKClient alloc] init] autorelease];
client.baseURL = baseURL;
if (sharedClient == nil) {
[RKClient setSharedClient:client];
}
return client;
}
+ (RKClient*)clientWithBaseURL:(NSString*)baseURL username:(NSString*)username password:(NSString*)password {
RKClient* client = [RKClient clientWithBaseURL:baseURL];
client.username = username;
client.password = password;
return client;
}
- (id)init {
if (self = [super init]) {
_HTTPHeaders = [[NSMutableDictionary alloc] init];
self.serviceUnavailableAlertEnabled = NO;
self.serviceUnavailableAlertTitle = NSLocalizedString(@"Service Unavailable", nil);
self.serviceUnavailableAlertMessage = NSLocalizedString(@"The remote resource is unavailable. Please try again later.", nil);
}
return self;
}
- (void)dealloc {
self.baseURL = nil;
self.username = nil;
self.password = nil;
self.serviceUnavailableAlertTitle = nil;
self.serviceUnavailableAlertMessage = nil;
[_HTTPHeaders release];
[super dealloc];
}
- (BOOL)isNetworkAvailable {
BOOL isNetworkAvailable = NO;
if (self.baseURLReachabilityObserver) {
isNetworkAvailable = [self.baseURLReachabilityObserver isNetworkReachable];
} else {
RKReachabilityObserver* googleObserver = [RKReachabilityObserver reachabilityObserverWithHostName:@"google.com"];
isNetworkAvailable = [googleObserver isNetworkReachable];
}
return isNetworkAvailable;
}
- (NSString*)resourcePath:(NSString*)resourcePath withQueryParams:(NSDictionary*)queryParams {
return [NSString stringWithFormat:@"%@?%@", resourcePath, [queryParams URLEncodedString]];
}
- (NSURL*)URLForResourcePath:(NSString*)resourcePath {
return [RKURL URLWithBaseURLString:self.baseURL resourcePath:resourcePath];
}
- (NSString*)URLPathForResourcePath:(NSString*)resourcePath {
return [[self URLForResourcePath:resourcePath] absoluteString];
}
- (NSURL*)URLForResourcePath:(NSString *)resourcePath queryParams:(NSDictionary*)queryParams {
return [self URLForResourcePath:[self resourcePath:resourcePath withQueryParams:queryParams]];
}
- (void)setupRequest:(RKRequest*)request {
request.additionalHTTPHeaders = _HTTPHeaders;
request.username = self.username;
request.password = self.password;
}
- (void)setValue:(NSString*)value forHTTPHeaderField:(NSString*)header {
[_HTTPHeaders setValue:value forKey:header];
}
- (void)setBaseURL:(NSString*)baseURL {
[_baseURL release];
_baseURL = nil;
_baseURL = [baseURL retain];
[_baseURLReachabilityObserver release];
_baseURLReachabilityObserver = nil;
// Don't crash if baseURL is nil'd out (i.e. dealloc)
if (baseURL) {
NSURL* URL = [NSURL URLWithString:baseURL];
_baseURLReachabilityObserver = [[RKReachabilityObserver reachabilityObserverWithHostName:[URL host]] retain];
}
}
- (RKRequest*)requestWithResourcePath:(NSString*)resourcePath delegate:(id)delegate {
RKRequest* request = [[RKRequest alloc] initWithURL:[self URLForResourcePath:resourcePath] delegate:delegate];
[self setupRequest:request];
[request autorelease];
return request;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// Asynchronous Requests
///////////////////////////////////////////////////////////////////////////////////////////////////////////
- (RKRequest*)load:(NSString*)resourcePath method:(RKRequestMethod)method params:(NSObject<RKRequestSerializable>*)params delegate:(id)delegate {
RKRequest* request = [[RKRequest alloc] initWithURL:[self URLForResourcePath:resourcePath] delegate:delegate];
[self setupRequest:request];
[request autorelease];
request.method = method;
request.params = params;
[request send];
return request;
}
- (RKRequest*)get:(NSString*)resourcePath delegate:(id)delegate {
return [self load:resourcePath method:RKRequestMethodGET params:nil delegate:delegate];
}
- (RKRequest*)get:(NSString*)resourcePath queryParams:(NSDictionary*)queryParams delegate:(id)delegate {
NSString* resourcePathWithQueryString = [NSString stringWithFormat:@"%@?%@", resourcePath, [queryParams URLEncodedString]];
return [self load:resourcePathWithQueryString method:RKRequestMethodGET params:nil delegate:delegate];
}
- (RKRequest*)post:(NSString*)resourcePath params:(NSObject<RKRequestSerializable>*)params delegate:(id)delegate {
return [self load:resourcePath method:RKRequestMethodPOST params:params delegate:delegate];
}
- (RKRequest*)put:(NSString*)resourcePath params:(NSObject<RKRequestSerializable>*)params delegate:(id)delegate {
return [self load:resourcePath method:RKRequestMethodPUT params:params delegate:delegate];
}
- (RKRequest*)delete:(NSString*)resourcePath delegate:(id)delegate {
return [self load:resourcePath method:RKRequestMethodDELETE params:nil delegate:delegate];
}
@end