我正在尝试使用Restkit发布一个对象,但是当我设置一些额外的参数时,它不再发布该对象了。
NSDictionary *params = [NSDictionary dictionaryWithObject:@"mic" forKey:@"type"];
[[RKObjectManager sharedManager] sendObject:rating toResourcePath:@"/mic" usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.method = RKRequestMethodPOST;
loader.params = params; // without this line, the 'rating' object is posted,
}];
我需要发送不包含在对象中的额外POST参数,使用上面的代码,我通过POST接收额外的“type”参数,但是没有收到对象。
我阅读了文档https://github.com/RestKit/RestKit/wiki/Object-mapping的参数部分 - 由于方法已经改变,文档必须有点旧,但概念是相同的。我不明白我做错了什么......非常感谢帮助。
答案 0 :(得分:3)
搜索RestKit的“prepareURLRequest”来源
第一行是:
if ((self.sourceObject && self.params == nil) && (self.method == RKRequestMethodPOST || self.method == RKRequestMethodPUT))
所以,你的sourceObject是有效的,但你的params不是nil,所以你的对象永远不会被序列化。
此外,当您的对象成功序列化后,它将被置于“params”值中。所以,如果你说“loader.params = params”,你就会覆盖你的初始对象。
这里的最佳解决方案是更改“sourceObject”,使其中包含额外的参数,并相应地为其创建映射。
除此之外,您可能必须使用更通用的方法(查看loadObject),并在块中将方法更改为“POST”并手动更改构建后数据块。
答案 1 :(得分:1)
我找到了解决方案,它有点长,因为在使用sendObject
和loadObject
时,遗憾的是,该方法假定您将返回与您发送的对象相同的对象。这不是我的情况,因为它将返回相同的对象...或错误对象。所以我就这样做了
RKObjectManager *manager = [RKObjectManager sharedManager];
[manager loadObjectsAtResourcePath:@"/mic" usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.method = RKRequestMethodPOST;
NSError* error;
RKObjectMapping* serializationMapping = [manager.mappingProvider serializationMappingForClass:[Rating class]];
RKObjectSerializer* serializer = [RKObjectSerializer serializerWithObject:rating mapping:serializationMapping];
id params = [serializer serializationForMIMEType:manager.serializationMIMEType error:&error];
if (error) {
NSLog(@"Error serializing object");
}
NSLog(@"Params class: %@", [params class]);
if ([params respondsToSelector:@selector(setValue:forKey:)])
[params performSelector:@selector(setValue:forKey:) withObject:@"mic" withObject:@"type"];
loader.params = params;
}];
我在块中序列化了对象,然后在结果字典中添加了一个参数。这样,我不必给对象一个额外的“类型”属性......这意味着我必须将它添加到我计划发布的每个对象上。