Ios 从响应(RestKit)加载对象时出错

Ios 从响应(RestKit)加载对象时出错,ios,xcode,restkit,Ios,Xcode,Restkit,我为rest响应创建了一个映射,并将其命名为Data。通过RKObObjectManager进行rest调用后,它没有加载对象。而是执行RKObjetLoader的didFailWithError方法。我的实现类继承自RKObObjectLoaderDelegate @implementation RKObjectLoaderExamples -(void)loadData{ RKObjectMapping* mapping = [RKObjectMapping map

我为rest响应创建了一个映射,并将其命名为Data。通过RKObObjectManager进行rest调用后,它没有加载对象。而是执行RKObjetLoader的didFailWithError方法。我的实现类继承自RKObObjectLoaderDelegate

@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超出了空数组的界限。我是否做错了?

您的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“获取”其余部分,这是否意味着我应该使用RKClient?我应该如何将RKClient与RKObjectManager一起使用?如何处理身份验证取决于您的后端。如果您的后端需要查询字符串中的身份验证数据,您的做法是正确的。但是,如果您的后端需要HTTP基本访问身份验证,您应该使用RKClient为接收到的身份验证挑战提供凭据。您只需设置一次凭据,RestKit将在需要时使用它们。好的,我忽略了日志状态您肯定需要为RKClient设置凭据。由于RKClient是一个单例,因此将代码放置在何处并不重要,只需确保在使用Manager加载对象之前调用它即可。您是否需要多个RKCobjectManager?(即,您访问更多基本URL)如果不是,则有点过于复杂。是否仍有相同的错误?请参阅我的更新答案。您正在使用以下代码定义新的空映射:
RKObjectMapping*mapping=[RKObjectMappingForClass:[Data class]];
因此restkit不知道如何将API响应映射到数据类。因此,您最初的问题得到了解决(身份验证),但您仍然需要定义映射。