0

我正在尝试使用 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 接收到额外的“类型”参数,但未接收到对象。

我阅读了文档https://github.com/RestKit/RestKit/wiki/Object-mapping的参数部分- 由于方法已更改,文档必须有点旧,但概念是相同的。我没有看到我做错了什么......非常感谢帮助。

4

2 回答 2

3

搜索 RestKit 的“prepareURLRequest”源

第一行写着:

    if ((self.sourceObject && self.params == nil) && (self.method == RKRequestMethodPOST || self.method == RKRequestMethodPUT))

所以,你的 sourceObject 是有效的,但你的参数不是零,所以你的对象永远不会被序列化。

此外,当您的对象成功序列化时,它会被放入“params”值中。所以,如果你说“loader.params = params”,你就是在覆盖你的初始对象。

这里最好的解决方案是更改“sourceObject”,使其具有额外的参数,并相应地为其创建映射。

除此之外,您可能必须使用更通用的方法(查看 loadObject)并在您的块中,将方法更改为“POST”并手动更改构建您的 post-data 块。

于 2012-09-04T13:32:19.763 回答
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;
    }];

我序列化了块中的对象,然后在结果字典中添加了一个参数。这样,我不必给对象一个额外的“类型”属性......这意味着我必须将它添加到我计划发布的每个对象中。

于 2012-09-04T14:20:50.880 回答