从响应中加载对象时出现错误(RestKit)

6

我创建了一个针对REST响应的映射,并将其命名为“Data”。通过RKObjectManager进行REST调用后,它无法加载对象。相反,它执行了RKObjetLoader的didFailWithError方法。我的实现类继承自RKObjectLoaderDelegate。

@implementation RKObjectLoaderExamples

    -(void)loadData{
        RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Data class]];
        RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:8080/activiti-rest/service"];  
        [manager loadObjectsAtResourcePath:@"/process-definitions?start=0&size=10&sort=id&order=asc&username=kermit&password=kermit" objectMapping:mapping delegate:self]  ;
        NSLog(@"Loaded Data");
    }

    // RKObjectLoaderDelegate methods  

    - (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {  
        NSLog(@"objectLoaded");
        Data* data = [objects objectAtIndex:0];  
        NSLog(@"Loaded Key: %@, Name: %@", data.key, data.name);  
    }  


    - (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {  
        NSLog(@"Encountered an error: %@", error);  
    }
@end  

我收到的错误信息如下:
2011-11-16 14:36:38.971 Views[16753:fb03] W restkit.network:RKResponse.m:182 Received an authentication challenge without any credentials to satisfy the request.
2011-11-16 14:36:38.974 Views[16753:fb03] W restkit.network:RKObjectLoader.m:242 Unable to find parser for MIME Type 'text/html'
2011-11-16 14:36:38.975 Views[16753:fb03] W restkit.network:RKObjectLoader.m:259 Encountered unexpected response with status code: 401 (MIME Type: text/html)
2011-11-16 14:36:38.976 Views[16753:fb03] Encountered an error: Error Domain=org.restkit.RestKit.ErrorDomain Code=4 "The operation couldn’t be completed. (org.restkit.RestKit.ErrorDomain error 4.)"

请帮帮我!

修改后,我将函数更改为:

-(void)loadData{

    [RKClient setSharedClient:[[RKClient alloc] initWithBaseURL:@"http://localhost:8080/activiti-rest/service"]];
    RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Data class]];
    RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:8080/activiti-rest/service"];  
     [manager setClient:[RKClient sharedClient]];
    [[RKClient sharedClient] setUsername:@"kermit"];
    [[RKClient sharedClient] setPassword:@"kermit"];
    [manager loadObjectsAtResourcePath:@"/process-definitions?start=0&size=10&sort=id&order=asc" objectMapping:mapping delegate:self]  ;
    NSLog(@"Loaded Data");

}

这样做正确吗?因为现在对象似乎已经加载,但是我得到了一个空数组的索引0超出范围的错误。我做错了吗?

1个回答

3
您的API返回HTTP错误401未经授权。您的后端是否需要HTTP身份验证?如果是,请向RKClient提供正确的凭据:
[[RKClient sharedClient] setUsername:myUsername];
[[RKClient sharedClient] setPassword:myPassword];

编辑:

我认为在设置RestKit时您存在一些基本问题。请考虑以下示例。

//in your appdelegate
RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:8080/activiti-rest/service"]; 
[[RKClient sharedClient] setUsername:@"kermit"];
[RKClient sharedClient] setPassword:@"kermit"];

// don't forget to create your mapping here
RKObjectMapping *dataMapping = [RKObjectMapping mappingForClass:[Data class]];
[dataMapping mapKeyPath:@"myKeyPath" toAttribute:@"myAttr"];
[[manager mappingProvider] addObjectMapping: dataMapping];

然后,你只需这样做。
 -(void)loadData{
    // fetch your mapping
    [RKObjectMapping *mapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[Data class]]; 
    //request data
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/process-definitions?start=0&size=10&sort=id&order=asc" objectMapping:mapping delegate:self];
}

首先,您需要进行设置(RKClient、映射和RKObjectManager) - 只需进行一次设置。它们是单例模式,因此设置将被保存。我发现这样做的最佳位置是AppDelegate - 可以随意尝试,但请确保在进行任何请求之前进行设置。
当您要执行任何请求时,只需使用您的[[RKObjectManager sharedManager]单例加载实际对象。
此外,我建议阅读一些文档,例如对象映射指南

是的,它需要验证。所以我尝试将其作为查询字符串的一部分附加。但如果我使用RKObjectManager进行REST‘get’请求,那不是意味着我可以不使用RKClient吗?我应该如何在RKObjectManager中使用RKClient? - Anusha Pachunuri
好的,我忽略了日志语句。你肯定需要为RKClient设置凭据。由于RKClient是单例模式,所以代码放在哪里并不重要,只要确保在使用管理器加载对象之前调用即可。 - mja
你需要多个RKObjectManagers吗?(例如,您访问更多的baseUrls)如果不需要,那么这有点过于复杂了。您还是遇到同样的错误吗? - mja
我只使用了一个RKObjectManager,你的意思是我需要再次配置客户端的baseURL吗?我已经编辑了问题,请问您看到我提到的错误了吗? - Anusha Pachunuri
1
你正在使用以下代码定义新的空映射:RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Data class]]; 因此,restkit不知道如何将API响应映射到Data类。因此,您的初始问题已解决(身份验证),但您仍需要定义映射。 - mja
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接