RestKit 0.20.0 - 带有JSON HTTP Body请求的getObjectsAtPath

时间:2012-12-12 17:27:27

标签: objective-c ios restkit afnetworking

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已被以下方法替换,在NSDictionary中无法再传递parameters,用作HTTP正文(JSON编码):

[RKObjectManager.sharedManager getObjectsAtPath:path parameters:params success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
{
    NSLog(@"success");
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"failure");
}];

使用[[RKObjectManager sharedManager].HTTPClientAFNetworking)时,设置时就像魅力一样:

[[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也有效。

这是一个错误,它尚未实施,还是我错过了什么?

非常感谢。

3 个答案:

答案 0 :(得分:3)

我真的错过了什么。

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;

请原谅这个仓促的问题。我以前应该看过它。

答案 1 :(得分:0)

如果我正确地理解了你的问题,那么RestKit的创建者会在开发分支中推送一些东西(它总是经过测试并且非常安全)可以解决你的问题(Commit here),它基本上默认设置为:< / p>

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

希望这有帮助!

答案 2 :(得分:0)

getObjectsAtPath: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");
                            }];