如何在RestKit中映射动态响应?

时间:2014-01-12 12:41:49

标签: ios iphone objective-c restkit

我对服务中的对象有两种不同的响应:

这是没有错误时的第一个回复:

{"responseError":{"ApplicationErrorCode":101,"DeveloperMessage":"Code is needed","UserMessage":null},"shortToken":null}

这是出现错误时的第二个响应:

{"responseError":null,"shortToken":sometoken}

我创建了一个名为RKShortToken的对象,它看起来像这样:

@interface RKShortToken : NSObject
@property (copy, nonatomic) RKResponseError *responseError;
@property (copy, nonatomic) NSString *shortToken;
@end

此外,我还有一个名为RKResponseError的对象:

@interface RKResponseError : NSObject
@property (copy, nonatomic) NSString *applicationErrorCode;
@property (copy, nonatomic) NSString *developerMessage;
@property (copy, nonatomic) NSString *userMessage;
@end

首先初始化RestKit客户端:

NSURL *baseURL = [NSURL URLWithString:kServiceDevBaseURL];
self.manager = [RKObjectManager managerWithBaseURL:baseURL];
[self.manager setRequestSerializationMIMEType:RKMIMETypeJSON];
[self.manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON];
[self.manager addResponseDescriptorsFromArray:[RKObjectManager sharedManager].responseDescriptors];
[self.manager addRequestDescriptorsFromArray:[RKObjectManager sharedManager].requestDescriptors];
[self.manager.HTTPClient.operationQueue setMaxConcurrentOperationCount:5];
[RKObjectManager setSharedManager:self.manager];

比添加路线:

RKRoute *shortTokenRoute = [RKRoute routeWithClass:[RKShortToken class] pathPattern:@"users/login/quick/shortToken" method:RKRequestMethodGET];
shortTokenRoute.shouldEscapePath = YES;
[self.manager.router.routeSet addRoute:shortTokenRoute];

然后添加一个描述符:

RKObjectMapping *shortTokenMapping = [RKObjectMapping mappingForClass:[RKShortToken class]];
[shortTokenMapping addAttributeMappingsFromDictionary:@{ @"responseError" : @"responseError", @"shortToken" : @"shortToken" }];
RKResponseDescriptor *shortTokenDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:shortTokenMapping
                                                                                          method:RKRequestMethodAny
                                                                                     pathPattern:@"users/login/quick/shortToken"
                                                                                         keyPath:nil
                                                                                     statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor:shortTokenDescriptor];

如何使用RestKit处理此类响应?我认为我的路线或描述符的内容是错误的。

提前致谢!

1 个答案:

答案 0 :(得分:1)

RKRoute个对象用于请求,因此它们不参与处理响应数据。

您的响应描述符具有单独的映射:@"responseError" : @"responseError" - 如果您将响应直接映射到字典中,则会使用此映射:@property (copy, nonatomic) NSDictionary *responseError;

由于您希望将响应映射到RKResponseError实例,您需要为该类创建另一个映射,并使用addRelationshipMappingWithSourceKeyPath:@"responseError" mapping:responseErrorMapping将新映射连接到“外部”映射。

最后,请注意RK是RestKit的命名前缀,您应该为自己创建的类使用不同的前缀。