使用 RestKit 0.20 对集合进行自定义请求映射

Posted

技术标签:

【中文标题】使用 RestKit 0.20 对集合进行自定义请求映射【英文标题】:Custom request mapping on collection with RestKit 0.20 【发布时间】:2013-05-07 08:21:25 【问题描述】:

我正在尝试找到一种将对象集合正确映射到具有特定格式的 JSON 字典的方法。

我有一个具有以下接口的对象(部分):

@interface Reward : NSObject
...
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* comment;
@property (nonatomic, strong) NSMutableOrderedSet* receivers; //set of User
...
@end

而用户对象(部分)是:

@interface User : NSManagedObject
...
@property (nonatomic, strong) NSNumber* userId
...
@end

目标是发布一个奖励对象以及 receivers 属性。

我可以想出一个适用于 titlecomment 属性的 RKObjectMapping,但是 receivers 集合需要以下格式:

"receivers":"0":"<user_id_of_first_user>", "1":"<user_id_of_second_user>", ...

我的主要问题是如何将索引作为键插入。

我可以手动完成并调整 NSURLRequest HTTPBody,但我希望找到一种更干净/RestKit 的方式。

提前致谢。

【问题讨论】:

您正在寻找的输出不是我所说的 JSON 的干净使用,所以我认为实际上没有办法使用 RestKit 来实现。你需要自己做。出于兴趣,您为什么需要这种形式的 JSON? 感谢您的回复。我同意格式不标准的事实。最后,我可以让负责 API 的人对其进行修改以接受标准格式 "receivers":["id":"", ...] 【参考方案1】:

如果你想这样做,就像你说的那样,使用 NSMutableURLRequest 并添加你的奖励方法请求,它会为你的 json 提供 NSString 这个简单的代码可以帮助你和像我这样的其他开发人员:

RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[RKObjectManager baseUrl]];
Reward *reward = [[Reward alloc] init];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Reward class]];
RKResponseDescriptor *desc = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodPOST pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[manager addResponseDescriptor:desc];
RKObjectManager *objectManager = [RKObjectManager sharedManager];
NSMutableURLRequest *request =
[objectManager requestWithObject:reward method:RKRequestMethodPOST path:@"yourpath" parameters:nil];
 NSString *str = [NSString stringWithFormat:@"\"receivers\":%@",reward.request];
[request setHTTPBody:[str dataUsingEncoding:NSUTF8StringEncoding]];
RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[desc]];
[operation setCompletionBlockWithSuccess:success failure:failure];
operation.targetObject = reward;
[operation start];

希望对大家有帮助

【讨论】:

以上是关于使用 RestKit 0.20 对集合进行自定义请求映射的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestKit 0.20 备份核心数据

使用 RestKit 0.20 发布 - NSManagedObjectContext 问题

从 RestKit 0.10 更新到 0.20

RestKit 0.20:restkit 对象映射使属性映射加倍

使用 RestKit 0.20 的对象映射关系

Restkit 0.20 嵌套对象数组映射问题