-
-
Save khanlou/e0bc14836a4647a1ca8a to your computer and use it in GitHub Desktop.
New Networking
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// RGJSONResponseTransformer.m | |
// RapGenius | |
// | |
// Created by Soroush Khanlou on 1/20/15. | |
// Copyright (c) 2015 Genius. All rights reserved. | |
// | |
#import "RGJSONResponseTransformer.h" | |
#import <NSObject+JSON.h> | |
#import <NSString+DataConversion.h> | |
@implementation RGJSONResponseTransformer | |
- (id)transformResponse:(NSURLResponse *)response andData:(NSData *)data { | |
return data.stringRepresentation.objectFromJSONString; | |
} | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// RGLoginRequest.m | |
// RapGenius | |
// | |
// Created by Soroush Khanlou on 1/20/15. | |
// Copyright (c) 2015 Genius. All rights reserved. | |
// | |
#import "RGLoginRequest.h" | |
#import "RGJSONResponseTransformer.h" | |
@implementation RGLoginRequest | |
- (instancetype)initWithUserName:(NSString *)username password:(NSString *)password { | |
if (!username || !password) { | |
self = nil; | |
return nil; | |
} | |
self = [super init]; | |
if (!self) return nil; | |
_username = username; | |
_password = password; | |
return self; | |
} | |
- (NSString *)method { | |
return @"POST"; | |
} | |
- (NSURL *)baseURL { | |
return [NSURL URLWithString:@"https://api.genius.com"]; | |
} | |
- (NSString *)path { | |
return @"/sessions"; | |
} | |
- (NSDictionary *)parameters { | |
return @{ | |
@"user": | |
@{ | |
@"login": self.username, | |
@"password": self.password, | |
} | |
}; | |
} | |
- (NSDictionary *)headers { | |
return @{ | |
@"Accept": @"application/json", | |
@"Content-Type": @"application/json", | |
}; | |
} | |
- (id<RGResponseTransformer>)transformer { | |
return [RGJSONResponseTransformer new]; | |
} | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// RGRequestSender.m | |
// RapGenius | |
// | |
// Created by Soroush Khanlou on 1/20/15. | |
// Copyright (c) 2015 Genius. All rights reserved. | |
// | |
#import "RGRequestSender.h" | |
#import <NSObject+JSON.h> | |
#import <NSString+DataConversion.h> | |
#import "RGSafeRequestTemplate.h" | |
@implementation RGRequestSender | |
- (instancetype)initWithURLSession:(NSURLSession *)session { | |
self = [super init]; | |
if (!self) return nil; | |
_session = session; | |
return self; | |
} | |
- (instancetype)init { | |
return [self initWithURLSession:[NSURLSession sharedSession]]; | |
} | |
- (void)sendRequestWithURLRequestTemplate:(id<RGRequestTemplate>)unsafeTemplate target:(id<RGRequestTarget>)target { | |
RGSafeRequestTemplate *safeTemplate = [[RGSafeRequestTemplate alloc] initWithTemplate:unsafeTemplate]; | |
NSURLRequest *request = [self requestWithTemplate:safeTemplate] ; | |
[[self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { | |
dispatch_async(dispatch_get_main_queue(), ^{ | |
if (error) { | |
if ([target respondsToSelector:@selector(requestFailedWithError:)]) { | |
[target requestFailedWithError:error]; | |
} | |
} else { | |
if ([target respondsToSelector:@selector(requestCompletedWithResult:)]) { | |
id result; | |
id<RGResponseTransformer> transformer = [safeTemplate transformer]; | |
if (transformer) { | |
result = [transformer transformResponse:response andData:data]; | |
} else { | |
result = data; | |
} | |
[target requestCompletedWithResult:result]; | |
} | |
} | |
}); | |
}] resume]; | |
} | |
- (NSURLRequest *)requestWithTemplate:(RGSafeRequestTemplate *)safeTemplate { | |
NSMutableURLRequest *URLRequest = [[NSMutableURLRequest alloc] init]; | |
URLRequest.HTTPMethod = [safeTemplate method]; | |
URLRequest.HTTPBody = [safeTemplate parameters].JSONString.dataRepresentation; | |
NSURLComponents *URLComponents = [NSURLComponents componentsWithURL:[safeTemplate baseURL] resolvingAgainstBaseURL:YES]; | |
NSString *path = [URLComponents.path stringByAppendingString:[safeTemplate path]]; | |
URLComponents.path = path; | |
URLRequest.URL = URLComponents.URL; | |
[[safeTemplate headers] enumerateKeysAndObjectsUsingBlock:^(NSString *fieldName, NSString *value, BOOL *stop) { | |
[URLRequest addValue:value forHTTPHeaderField:fieldName]; | |
}]; | |
return URLRequest; | |
} | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// RGSafeRequestTemplate.m | |
// RapGenius | |
// | |
// Created by Soroush Khanlou on 1/20/15. | |
// Copyright (c) 2015 Genius. All rights reserved. | |
// | |
#import "RGSafeRequestTemplate.h" | |
@implementation RGSafeRequestTemplate | |
- (instancetype)initWithTemplate:(id<RGRequestTemplate>)template { | |
self = [super init]; | |
if (!self) return nil; | |
_unsafeTemplate = template; | |
return self; | |
} | |
- (NSString *)method { | |
if ([self.unsafeTemplate respondsToSelector:@selector(method)]) { | |
return [self.unsafeTemplate method]; | |
} | |
return nil; | |
} | |
- (NSURL *)baseURL { | |
if ([self.unsafeTemplate respondsToSelector:@selector(baseURL)]) { | |
return [self.unsafeTemplate baseURL]; | |
} | |
return nil; | |
} | |
- (NSString *)path { | |
if ([self.unsafeTemplate respondsToSelector:@selector(path)]) { | |
return [self.unsafeTemplate path]; | |
} | |
return nil; | |
} | |
- (NSDictionary *)parameters { | |
if ([self.unsafeTemplate respondsToSelector:@selector(parameters)]) { | |
return [self.unsafeTemplate parameters]; | |
} | |
return nil; | |
} | |
- (NSDictionary *)headers { | |
if ([self.unsafeTemplate respondsToSelector:@selector(headers)]) { | |
return [self.unsafeTemplate headers]; | |
} | |
return nil; | |
} | |
- (id<RGResponseTransformer>)transformer { | |
if ([self.unsafeTemplate respondsToSelector:@selector(transformer)]) { | |
return [self.unsafeTemplate transformer]; | |
} | |
return nil; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment