RestKit GET查询参数(RestKit GET query parameters)

2019-06-25 20:17发布

我一直在使用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维基 , RestKit谷歌组 ),我现在才知道被视为有效的两种解决方案:

  • 追加查询参数的资源路径。

这完美的作品。

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. 为什么没有第二个解决方案的工作?
  2. 为什么工作,而不必设置loader.targetObject到零的第一个解决方案,虽然我没有在JSON响应的任何根密钥路径?
  3. 什么是我应该使用GetObject情况:usingBlock方法? 什么是预期目的?
  4. 我应该用什么loader.params呢? 从对象映射教程维基说,这个属性可以用来封装POST参数,但我不明白这一点,因为我可以在正在与方法postObject发送的序列化对象包装参数:usingBlock。

谢谢。

[以后编辑]

关于回答我的第二个问题:我一直在targetObject在装载机块进行POST请求时东阳否则RestKit会尝试使用发送对象映射为响应(选中该设置为零链接的相关讨论)。 但是,由于我使用loadObjectsAtResourcePath:usingBlock :,有不发送对象,因此响应将自然地映射所述响应映射而无需设定targetObject为nil。

Answer 1:

  1. 为什么没有第二个解决方案的工作?

params为用于创建HTTP体,这是不在GET / HEAD请求使用。

  1. 为什么工作,而不必设置loader.targetObject到零的第一个解决方案,虽然我没有在JSON响应的任何根密钥路径?

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

  1. 什么是我应该使用GetObject情况:usingBlock方法? 什么是预期目的?

这是一种便捷的方法,所以你不必记住所有正确的语法。 内部,它只是将使用GET物体装载请求。

编辑:

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

  1. 我应该用什么loader.params呢? 从维基对象映射教程说这个属性可以用来封装POST参数,但我不明白这一点,因为我可以在正在与方法postObject发送的序列化对象包装参数:usingBlock。

无论在PARAMS你把将被序列化到一个HTTP体(或身体流)。 再次,postObject:usingBlock:仅仅是一个方便的方法,这样你就不必记住一切。

RestKit是开源的。 如果你不知道它是如何运作的,你可以自由地按照参数内部。 如果你的应用程序和Web服务设计好了,你应该能够使用的便捷方法。 有时候,你不能,那么你可以使用原始形式就像你做了。

编辑:Q HRM,引用您的要点搞砸的数字...



Answer 2:

我解决了添加类别来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"在实现文件。 在这种新方法是假设router RKObjectManager的财产已拨打电话给它定义。



文章来源: RestKit GET query parameters