1

RESTKit を使用してデータ (具体的には Web サイトの認証トークン) を投稿しようとしていますが、問題が発生しています。メソッドを実行するたびに、次のようになります。

'NSInvalidArgumentException', reason: '`RKRequestDescriptor` objects must be initialized 
with a mapping whose target class is `NSMutableDictionary`, got 'Login' (see 
`[RKObjectMapping requestMapping]`)'

また、コードには「互換性のないポインター型」という警告が多数あります。

これが本当に醜くて悪い私の方法です。修正の助けが欲しいです。[self postToken]ボタンが押されたときに IBAction メソッド内で実行します。RESTKitを使用しないPOSTリクエストからのjsonレスポンスを使用して設定されている別のファイルから変数userAuthTokenを取得しています。成功する方法がわかったら、最終的にその POST を RESTKit に変換します。メソッド「userAuthTokenMethod」は「postToken」メソッドと同じファイルにあり、AppDelegate で初期化されてグローバル変数として機能する userAuthToken オブジェクトを使用できます。

- (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

私は RESTKit に非常に慣れておらず、Objective-C にはやや慣れていません (約 1 か月コーディングしています)。コードを修正するためのすべての助けをいただければ幸いです。

4

1 に答える 1