RestKit 0.20.0 - 带有 JSON HTTP 正文请求的 getObjectsAtPath

Posted

技术标签:

【中文标题】RestKit 0.20.0 - 带有 JSON HTTP 正文请求的 getObjectsAtPath【英文标题】:RestKit 0.20.0 - getObjectsAtPath with JSON HTTP Body request 【发布时间】:2012-12-12 17:27:27 【问题描述】:

我在RestKit 0.10.x 版本中使用

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/special/path" usingBlock:^(RKObjectLoader *loader) 
            loader.objectMapping = aMapping;
            loader.delegate = _delegate;
            loader.method = RKRequestMethodPOST;
            loader.userData = [MobileGatewayReauthentication class];
            loader.params = [anDictionary toJsonRKParam];
        ];

NSDictionary 添加到loader.params 以将参数集合作为请求的HTTP 正文发送。


从 RestKit 0.20.0 开始,方法 loadObjectsAtResourcePath 已被以下方法替换,其中不再可能在 parameters 中传递 NSDictionary,它用作 HTTP 正文(JSON 编码):

[RKObjectManager.sharedManager getObjectsAtPath:path parameters:params success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)

    NSLog(@"success");
 failure:^(RKObjectRequestOperation *operation, NSError *error) 
    NSLog(@"failure");
];

当使用[[RKObjectManager sharedManager].HTTPClient (AFNetworking) 时,它在设置时就像一个魅力:

[[RKObjectManager sharedManager].HTTPClient setParameterEncoding:AFJSONParameterEncoding];

[[RKObjectManager sharedManager].HTTPClient postPath:path parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"Response: %@", operation.responseString);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@",error.localizedDescription);
];

但我需要更高级别的对象映射器。


[[RKObjectManager sharedManager].HTTPClient setParameterEncoding:AFJSONParameterEncoding];

对 [RKObjectManager sharedManager] 没有影响,但是

[[RKObjectManager sharedManager].HTTPClient setDefaultHeader:@"aHeader" value:@"aValue"];

有。所以我假设setParameterEncoding 也有效。

这是一个错误,是尚未实现,还是我遗漏了什么?

非常感谢。

【问题讨论】:

【参考方案1】:

我真的错过了什么。

loadObjectsAtResourcePath 得到(肯定)用RKRequestMethodGET 调用。所以参数会附加到 URL,而不是 HTTP 正文。

要将参数附加为 JSON HTTP 正文,您必须使用 post 方法,例如

- (void)postObject:(id)object
              path:(NSString *)path
        parameters:(NSDictionary *)parameters
           success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success
           failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure;

请原谅这个仓促的问题。我应该早就看过了。

【讨论】:

【参考方案2】:

如果我正确理解了您的问题,RestKit 创建者会在开发分支中推送一些内容(始终经过测试并且使用起来非常安全),这可能会解决您的问题 (Commit here),默认情况下基本上设置为:

[[RKObjectManager sharedManager].HTTPClient setDefaultHeader:@"Accept" value:RKMIMETypeJSON];
[[RKObjectManager sharedManager].HTTPClient registerHTTPOperationClass:[AFJSONRequestOperation class]];

希望对您有所帮助!

【讨论】:

我拉取了最新的开发分支提交,但是没有用。我已编辑问题以阐明我的需求。【参考方案3】:

getObjectsAtPath:path 中的 path 可能有问题 如果您在路径的开头使用斜杠 (/),请将其移至 baseurl 的末尾,如下例所示。

NSURL *baseURL = [NSURL URLWithString:@"http://rest.example.com:8080/test/"];
    AFHTTPClient* client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];


[objectManager getObjectsAtPath:@"rest/updates"
                         parameters:nil
                            success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
                                NSLog(@"success");
                            
                            failure:^(RKObjectRequestOperation *operation, NSError *error) 
                                NSLog(@"failure");
                            ];

【讨论】:

以上是关于RestKit 0.20.0 - 带有 JSON HTTP 正文请求的 getObjectsAtPath的主要内容,如果未能解决你的问题,请参考以下文章

Restkit 版本 0.20.0-pre2。 : 问题:post object 中没有键。如何发布?

Restkit 映射 0.2

Restkit 0.20.rc 需要但不包含多个 0.10 项

restkit 0.20.0 中的请求超时

restkit 版本 0.20 上的 fetchRequest - 没有已知的类方法

RestKit 0.20.0-rc1 - 如何映射多个错误参数?