Ошибка при загрузке объектов из Response (RestKit) - PullRequest
6 голосов
/ 16 ноября 2011

Я создал отображение для Остального отклика и назвал его Data. После выполнения вызова rest через RKObjectManager он не загружает объекты. Вместо этого он выполняет метод didFailWithError класса реализации RKObjetLoader.My, унаследованного от 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 голосов
/ 16 ноября 2011

Ваш API возвращает ошибку HTTP 401 Unauthorized. Ваш бэкэнд требует 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] singleton для загрузки реальных объектов.

Кроме того, я рекомендую вам прочитать некоторую документацию, например. Руководство по отображению объектов

...