2013-08-01 6 views
1

Я пытаюсь опубликовать некоторые данные (токен аутентификации для конкретного сайта) с помощью RESTKit, и у меня возникли проблемы. Каждый раз, когда я запускаю метод, я получаю это:Не удается выполнить запрос POST с RESTKit

Кроме того, есть много «Несовместимые типов указателей» предупреждения в коде.

Вот мой метод, который является действительно уродливым и плохим, и я бы хотел, чтобы какая-то помощь была исправлена. Я делаю [self postToken] внутри метода IBAction при нажатии кнопки. Я получаю переменную userAuthToken из другого файла, где он устанавливается с помощью json-ответа из запроса POST, не использующего RESTKit. Я в конечном итоге преобразую этот POST в RESTKit, когда знаю, как успешно. Метод «userAuthTokenMethod» находится в том же файле, что и метод postToken, и позволяет мне использовать объект userAuthToken, который инициализируется в AppDelegate, поэтому он действует как глобальная переменная.

- (void)postToken 
{   
    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Login class]]; 
    [mapping addAttributeMappingsFromDictionary:@{@"token": @"token"}]; 
    NSIndexSet *statusCodeSet = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); 
    RKResponseDescriptor *tokenResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:nil pathPattern:nil keyPath:nil statusCodes:statusCodeSet]; 
    RKRequestDescriptor *tokenRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:self rootKeyPath:nil method:nil]; 
    [[RKObjectManager sharedManager] addRequestDescriptor:tokenRequestDescriptor]; 
    RKObjectManager *tokenManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"https://websitetest.com/doctors/find"]]; 
    [tokenManager addResponseDescriptor:tokenResponseDescriptor]; 
    [tokenManager addRequestDescriptor:tokenRequestDescriptor]; 
    [tokenManager postObject:[[self userAuthTokenMethod] userAuthToken] path:nil parameters:nil success:nil failure:nil]; 


    NSURL *tokenURL = [NSString stringWithFormat:@"https://websitetest.com/doctors/find?name=%@&location=%@",nameIDTextField.text, locationTextField.text]; 
    NSMutableURLRequest *tokenRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:tokenURL]]; 
    RKObjectManager *tokenObjectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:tokenURL]]; 
    [tokenObjectManager.HTTPClient setDefaultHeader:@"Auth-Token" value:[[self network360Edge] userAuthToken]]; 
    RKObjectRequestOperation *tokenOperation = [[RKObjectRequestOperation alloc] initWithRequest:tokenRequest responseDescriptors:@[tokenResponseDescriptor]]; 
    NSLog(@"Token being POSTed ==> %@", [[self userAuthTokenMethod] userAuthToken]); 
    [tokenOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result){ 
     NSLog(@"Response for POST request with token ==> %@", [result array]); 
    }failure:nil]; 
    [tokenOperation start]; 
} 

Вот код для моего файла поставщика отображения называется MappingProvider:

//MappingProvider.h 
#import <Foundation/Foundation.h> 
#import <RestKit/RestKit.h> 

@interface MappingProvider : NSObject 

+(RKMapping *)tokenMapping; 

@end 

//MappingProvider.m 
#import "MappingProvider.h" 
#import <RestKit/RestKit.h> 
#import "Login.h" 

@implementation MappingProvider 

+(RKMapping *)tokenMapping 
{ 
    RKObjectMapping *tokenMapping = [RKObjectMapping mappingForClass:[Login class]]; 
    [tokenMapping addAttributeMappingsFromArray:@[@"token"]]; 
    return tokenMapping; 
} 

@end 

Вот код для входа в файл, в котором 'маркер' инициализируется:

//Login.h 
#import <Foundation/Foundation.h> 

@interface Login : NSObject 

@property (nonatomic, copy)NSString *token; 

@end 

Я m очень новый для RESTKit и несколько новый с Objective-C (я кодировал его около месяца). Я был бы признателен за помощь в исправлении моего кода.

+0

Я думаю, что вы не должны использовать ноль вместо ключевого ресурса в ResponseDescriptor. Скорее вы можете использовать пустую строку. И попробуйте установить метод запроса в ResponseDescriptor как RKRequestMethodPOST/GET, если применимо. Более того, поскольку RKObjectManager является общим классом, вы добавляете к нему один и тот же дескриптор дескриптора, добавляя дескрипторы в RKObjectManager и TokenManager. – execv

+0

Удалите строку, которая добавляет tokenRequestDescriptor в [RKObjectManager sharedManager]. – execv

+0

У меня есть такая же проблема с тобой, я хочу знать, была ли у тебя проблема решена? – Songlin

ответ

0

Этот вопрос старый, но проблема в том, что запросы должны использовать отображение без указания класса, поскольку запросы используют дескрипторы, которые определяют класс (см 2 строки ниже), например:

RKObjectMapping *requestMapping = [RKObjectMapping requestMapping]; 

Возможно, вы также проблема в строке:

RKRequestDescriptor *tokenRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:self rootKeyPath:nil method:nil]; 

более конкретно в Objectclass: само, она должна быть Objectclass: [само класс] или нужен класс, который совместно ntains лексема собственности, как это:

RKRequestDescriptor *tokenRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[self class] rootKeyPath:nil method:nil]; 

Надежда это помогает

Смежные вопросы