我已经使用RestKit 0.10.0一段时间了,直到现在,我只向服务器发布序列化对象:
[[RKObjectManager sharedManager] postObject:serializedObject
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.serializationMIMEType = RKMIMETypeFormURLEncoded;
loader.targetObject = nil;
}];
到目前为止,一切都很好。但是我现在需要向服务器发出GET请求并附带一些查询参数。我首先想到的自然是像发布对象那样做相同的事情:
- 为封装查询参数的对象创建序列化映射
- 为从服务器接收到的对象创建响应映射
- 定义并使用RKRequestMethodGET的路由(而不是RKRequestMethodPOST)
- 使用getObject:usingBlock进行请求(而不是postObject:usingBlock)
- 将查询参数附加到资源路径中。
NSDictionary *queryParams = [NSDictionary dictionaryWithObjectsAndKeys:
token, @"accessToken",
[NSNumber numberWithInt:level], @"level",
[NSNumber numberWithInt:count], @"count",
nil];
NSString* resourcePath = [PEER_SUGGESTIONS_CONTROLLER_PATH stringByAppendingQueryParameters:queryParams];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
}];
- 在加载器块中设置查询参数。
这不会发送查询参数。
RKParams *params = [RKParams params];
[params setValue:token forParam:@"accessToken"];
[params setValue:[NSNumber numberWithInt:level] forParam:@"level"];
[params setValue:[NSNumber numberWithInt:count] forParam:@"count"];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:PEER_SUGGESTIONS_CONTROLLER_PATH
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.params = params;
}];
我的问题是:
- 为什么第二个解决方案不起作用?
- 为什么第一个解决方案可以正常工作而不需要将loader.targetObject设置为nil,尽管JSON响应中没有任何根键路径?
- 在哪些情况下应该使用getObject:usingBlock方法?它的预期目的是什么?
- 我应该如何使用loader.params?wiki中的对象映射教程说这个属性可以用来封装POST参数,但我看不出有什么意义,因为我可以将参数包装在与postObject:usingBlock方法一起发送的序列化对象中。
关于我的第二个问题的答案:当进行POST请求时,我在加载器块中将targetObject设置为nil,因为否则RestKit会尝试使用发送对象映射进行响应(请参阅link相关讨论)。但是由于我正在使用loadObjectsAtResourcePath:usingBlock:,因此没有对象被发送,因此响应自然会映射到响应映射,而不必将targetObject设置为nil。