Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone RestKit获取查询参数_Iphone_Ios_Get_Restkit - Fatal编程技术网

Iphone RestKit获取查询参数

Iphone RestKit获取查询参数,iphone,ios,get,restkit,Iphone,Ios,Get,Restkit,我已经使用RestKit 0.10.0一段时间了,直到现在,我只将序列化对象发布到我的服务器: [[RKObjectManager sharedManager] postObject:serializedObject usingBlock:^(RKObjectLoader *loader) { loader.delegate = self;

我已经使用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做什么?来自的对象映射教程说,此属性可以用于封装POST参数,但我看不到这一点,因为我可以将参数包装在与方法postObject:usingBlock一起发送的序列化对象中
  • 谢谢

    [稍后编辑]

    关于我的第二个问题的答案:在发出POST请求时,我一直在加载器块中将targetObject设置为nil,否则RestKit将尝试对响应使用发送对象映射(请查看此项以了解相关讨论)。但由于我使用的是loadObjectsAtResourcePath:usingBlock:,因此没有发送任何对象,因此响应将自然映射到响应映射上,而无需将targetObject设置为nil

  • 为什么第二个解决方案不起作用
  • params用于创建一个HTTP主体,该主体不用于GET/HEAD请求

  • 为什么第一个解决方案不必将loader.targetObject设置为nil就可以工作,尽管我没有任何根密钥路径 在JSON响应中
  • 我认为targetObject默认为零。您通常不设置它,如果需要,请求将创建它。我唯一一次使用它是在请求没有主键或其他奇怪问题的对象时

  • 在哪些情况下我应该使用getObject:usingBlock方法?它的目的是什么
  • 这是一种方便的方法,因此您不必记住所有正确的语法。在内部,它只是使用GET发送一个对象加载请求

    编辑:

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

  • 我应该使用loader.params做什么?wiki上的对象映射教程说,这个属性可以用来封装POST 参数,但我看不到要点,因为我可以包装参数 在与方法一起发送的序列化对象中 postObject:使用block
  • 您在params中放入的任何内容都将被序列化为HTTP正文(或正文流)。同样,postObject:usingBlock:只是一种方便的方法,因此您不必记住所有内容

    RestKit是开源的。如果您不确定它是如何工作的,您可以自由地在内部遵循这些参数。如果您的应用程序和web服务设计良好,您应该能够使用方便的方法。有时候你不能,然后你可以像以前一样使用原始表单

    编辑:
    Q Hrm,引用你的要点弄乱了数字…

    我解决了在RKObjectLoader中添加一个类别的问题,即:

    方法

    -(void)getObject:(id<NSObject>)object usingBlock:(RKObjectLoaderBlock)block;
    
    -(void)getObject:(id)对象使用block:(RKObjectLoaderBlock)块;
    
    我在类别中添加了一种修改方法:

    -(void)getObject:(id<NSObject>)object queryParameters:(NSDictionary*)queryParameters usingBlock:(void(^)(RKObjectLoader *))block;
    
    -(void)getObject:(id)object queryParameters:(NSDictionary*)queryParameters使用block:(void(^)(RKObjectLoader*)块;
    
    这里是列出的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
    //  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
    
    //
    //RKObjectManager+QueryParameters.h
    //字母客户端
    //
    //安东尼奥·罗西于2012年7月14日创作。
    //
    #进口
    @接口对象管理器(查询参数)
    -(void)getObject:(id)object queryParameters:(NSDictionary*)queryParameters使用block:(void(^)(RKObjectLoader*)块;
    -(void)sendObject:(id)object queryParameters:(NSDictionary*)queryParameters方法:(RKRequestMethod)方法使用block:(void(^)(RKObjectLoader*)块;
    @结束
    
    以下是文件“RKObjectManager+QueryParameters.m”的列表:

    //
    //  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
    //  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
    
    //
    //RKObjectManager+QueryParameters.m
    //字母客户端
    //
    //安东尼奥·罗西于2012年7月14日创作。
    //
    #导入“RKObjectManager+QueryParameters.h”
    @实现对象管理器(查询参数)
    -(void)getObject:(id)object queryParameters:(NSDictionary*)queryParameters使用block:(void(^)(RKObjectLoader*loader))block{
    [self-sendObject:object queryParameters:queryParameters方法:RKRequestMethodGET usingBlock:block];
    }
    -(void)sendObject:(id)object queryParameters:(NSDictionary*)queryParameters方法:(RKRequestMethod)方法使用block:(void(^)(RKObjectLoader*)块{
    NSString*resourcePath=[self.router resourcePathForObject:object-method:method];
    [self-sendObject:object-toResourcePath:resourcePath usingBlock:^(RKObjectLoader*loader){
    loader.method=方法;
    //需要转换原始URL,因为当方法为GET时,不会添加其他参数
    RKURL*originalBaseURL=[RKURL URLWithBaseURL:[loader.URL baseURL]];
    NSString*resourcePath=[self.router resourcePathForObject:object方法:RKRequestMetho