我已经使用 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)发出请求
我很快发现这不是这样做的方法,因此在搜索了可用资源(RestKit Wiki、RestKit Google 组)之后,我现在知道两种被认为是有效的解决方案:
- 将查询参数附加到资源路径。
这完美地工作。
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 将尝试使用发送对象映射作为响应(查看此链接以获取相关讨论)。但是由于我使用的是 loadObjectsAtResourcePath:usingBlock:,所以没有对象被发送,因此响应自然会映射到响应映射上,而不必将 targetObject 设置为 nil。