RestKit GET查询参数

我一直在使用RestKit 0.10.0,直到现在,我只把序列化的对象发布到我的服务器上:

[[RKObjectManager sharedManager] postObject:serializedObject usingBlock:^(RKObjectLoader *loader) { loader.delegate = self; loader.objectMapping = responseMapping; loader.serializationMIMEType = RKMIMETypeFormURLEncoded; loader.targetObject = nil; }]; 

到现在为止还挺好。 但是我现在需要用几个查询参数向服务器发出一个GET请求。 想到的第一个自然的事情就是像我一样发布对象:

  • 为封装查询参数的对象创build一个序列化映射
  • 为从服务器接收的对象创build一个响应映射
  • 为RKRequestMethodGET定义并使用路由器(而不是RKRequestMethodPOST)
  • 使用getObject:usingBlock(而不是postObject:usingBlock)创build请求

我很快发现这不是这样做的,所以在search可用资源( RestKit Wiki , RestKit Google小组 )之后,我现在知道两种解决scheme被认为是有效的:

  • 将查询参数附加到资源path。

这完美的作品。

 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; }]; 

我的问题是:

  1. 为什么第二个解决scheme不工作?
  2. 为什么第一个解决scheme不需要将loader.targetObject设置为零,尽pipe我在JSON响应中没有任何根密钥path?
  3. 什么情况下,我应该使用getObject:usingBlock方法? 它的目的是什么?
  4. 我应该使用loader.params的? 来自维基的对象映射教程说,这个属性可以用来封装POST参数,但是我没有看到这个观点,因为我可以将参数封装在使用方法postObject:usingBlock发送的序列化对象中。

谢谢。

[更新]

关于我的第二个问题的答案:当发出POST请求时,我一直在加载程序块中将targetObject设置为零,否则RestKit将尝试使用发送对象映射作为响应(请查看此链接进行相关讨论)。 但是由于我使用的是loadObjectsAtResourcePath:usingBlock:,所以没有对象被发送,因此响应自然会映射到响应映射上,而不必将setObject设置为零。

  1. 为什么第二个解决scheme不工作?

params用于创build一个HTTP主体,它不用于GET / HEAD请求。

  1. 为什么第一个解决scheme不需要将loader.targetObject设置为零,尽pipe我在JSON响应中没有任何根密钥path?

我认为targetObject默认为零。 您通常不设置它,如果需要,请求将会创build它。 我唯一使用它的时候是请求没有主键或其他奇怪问题的对象。

  1. 什么情况下,我应该使用getObject:usingBlock方法? 它的目的是什么?

这是一个方便的方法,所以你不必记住所有正确的语法。 它在内部只是使用GET发送一个对象加载请求。

编辑:

如果您有要更新的对象,请使用此选项。

  1. 我应该使用loader.params的? 来自维基的对象映射教程说,这个属性可以用来封装POST参数,但是我没有看到这个观点,因为我可以将参数封装在使用方法postObject:usingBlock发送的序列化对象中。

无论你在params中input什么,都会被序列化为一个HTTP主体(或主体stream)。 再次,postObject:usingBlock:只是一个方便的方法,所以你不必记住一切。

RestKit是开源的。 如果你不确定它是如何工作的,你可以自由地遵循内部的参数。 如果您的应用程序和Web服务devise得很好,您应该可以使用便捷的方法。 有时你不能,然后你可以使用你所做的原始forms。

编辑:Q Hrm,引用你的子弹点数搞砸了…

我解决了向RKObjectLoader添加一个类别,即:

为方法

 -(void)getObject:(id<NSObject>)object usingBlock:(RKObjectLoaderBlock)block; 

我在类别中添加了一个修改的方法:

 -(void)getObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters usingBlock:(void(^)(RKObjectLoader *))block; 

这里是列表fpr文件“RKObjectManager + QueryParameters”:

 // // RKObjectManager+QueryParameters.h // AlphaClient // // Created by Antonio Rossi on 14/07/12. // #import <RestKit/RestKit.h> @interface RKObjectManager (QueryParameters) - (void)getObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters usingBlock:(void(^)(RKObjectLoader *))block; - (void)sendObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters method:(RKRequestMethod)method usingBlock:(void(^)(RKObjectLoader *))block; @end 

这里是文件“RKObjectManager + QueryParameters.m”的列表:

 // // RKObjectManager+QueryParameters.m // AlphaClient // // Created by Antonio Rossi on 14/07/12. // #import "RKObjectManager+QueryParameters.h" @implementation RKObjectManager (QueryParameters) - (void)getObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters usingBlock:(void(^)(RKObjectLoader *loader))block { [self sendObject:object queryParameters:queryParameters method:RKRequestMethodGET usingBlock:block]; } - (void)sendObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters method:(RKRequestMethod)method usingBlock:(void(^)(RKObjectLoader *))block { NSString *resourcePath = [self.router resourcePathForObject:object method:method]; [self sendObject:object toResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader) { loader.method = method; // need to transform the original URL because when method is GET the additional paramentes don't get added RKURL *originalBaseURL = [RKURL URLWithBaseURL:[loader.URL baseURL]]; NSString *resourcePath = [self.router resourcePathForObject:object method:RKRequestMethodGET]; RKURL *authTokenURL = [originalBaseURL URLByAppendingResourcePath:resourcePath queryParameters:queryParameters]; [loader setURL:authTokenURL]; block(loader); }]; } @end 

还有一步是在你的实现文件中添加#import "RKObjectManager+QueryParameters.h" 。 在这个新方法中,假定在调用RKObjectManager的router属性之前已经定义了它。