mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-05-04 20:41:18 +08:00
Implementation of Object Mapping 2.0 design:
* Removed RestKit from inheritance hierarchy * Mappings are implemented as concrete classes * Mapper is much more flexible & powerful * Much more robust error handling * Serialization is reimplemented as an object mapping operation * Added ability to serialize to JSON natively * Reworked Core Data integration * Simplified the codebase substantially
This commit is contained in:
95
Code/ObjectMapping/RKObjectRouter.m
Normal file
95
Code/ObjectMapping/RKObjectRouter.m
Normal file
@@ -0,0 +1,95 @@
|
||||
//
|
||||
// RKDynamicRouter.m
|
||||
// RestKit
|
||||
//
|
||||
// Created by Blake Watters on 10/18/10.
|
||||
// Copyright 2010 Two Toasters. All rights reserved.
|
||||
//
|
||||
|
||||
#import "RKObjectRouter.h"
|
||||
#import "RKClient.h"
|
||||
#import "NSDictionary+RKRequestSerialization.h"
|
||||
|
||||
@implementation RKObjectRouter
|
||||
|
||||
- (id)init {
|
||||
if ((self = [super init])) {
|
||||
_routes = [[NSMutableDictionary alloc] init];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[_routes release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)routeClass:(Class)class toResourcePath:(NSString*)resourcePath forMethodName:(NSString*)methodName {
|
||||
NSString* className = NSStringFromClass(class);
|
||||
if (nil == [_routes objectForKey:className]) {
|
||||
NSMutableDictionary* dictionary = [NSMutableDictionary dictionary];
|
||||
[_routes setObject:dictionary forKey:className];
|
||||
}
|
||||
|
||||
NSMutableDictionary* classRoutes = [_routes objectForKey:className];
|
||||
if ([classRoutes objectForKey:methodName]) {
|
||||
[NSException raise:nil format:@"A route has already been registered for class '%@' and HTTP method '%@'", className, methodName];
|
||||
}
|
||||
|
||||
[classRoutes setValue:resourcePath forKey:methodName];
|
||||
}
|
||||
|
||||
- (NSString*)HTTPVerbForMethod:(RKRequestMethod)method {
|
||||
switch (method) {
|
||||
case RKRequestMethodGET:
|
||||
return @"GET";
|
||||
break;
|
||||
case RKRequestMethodPOST:
|
||||
return @"POST";
|
||||
break;
|
||||
case RKRequestMethodPUT:
|
||||
return @"PUT";
|
||||
break;
|
||||
case RKRequestMethodDELETE:
|
||||
return @"DELETE";
|
||||
break;
|
||||
default:
|
||||
return nil;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Public
|
||||
|
||||
- (void)routeClass:(Class)class toResourcePath:(NSString*)resourcePath {
|
||||
[self routeClass:class toResourcePath:resourcePath forMethodName:@"ANY"];
|
||||
}
|
||||
|
||||
- (void)routeClass:(Class)class toResourcePath:(NSString*)resourcePath forMethod:(RKRequestMethod)method {
|
||||
NSString* methodName = [self HTTPVerbForMethod:method];
|
||||
[self routeClass:class toResourcePath:resourcePath forMethodName:methodName];
|
||||
}
|
||||
|
||||
#pragma mark RKRouter
|
||||
|
||||
- (NSString*)resourcePathForObject:(NSObject*)object method:(RKRequestMethod)method {
|
||||
NSString* methodName = [self HTTPVerbForMethod:method];
|
||||
NSString* className = NSStringFromClass([object class]);
|
||||
NSDictionary* classRoutes = [_routes objectForKey:className];
|
||||
|
||||
NSString* resourcePath = nil;
|
||||
if ((resourcePath = [classRoutes objectForKey:methodName])) {
|
||||
return RKMakePathWithObject(resourcePath, object);
|
||||
}
|
||||
|
||||
if ((resourcePath = [classRoutes objectForKey:@"ANY"])) {
|
||||
return RKMakePathWithObject(resourcePath, object);
|
||||
}
|
||||
|
||||
[NSException raise:nil format:@"Unable to find a routable path for object of type '%@' for HTTP Method '%@'", className, methodName];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user