1

プロジェクトで基本認証を使用しています。トークンを取得するには、get リクエストを送信してトークン オブジェクトを取得し、それを NSUserDefault として保存します。このトークンをすべての API 呼び出しにアタッチする必要があります (もちろん、ログインを除く)。

AFNetworking/RestKit でトークンを使用して API 呼び出しを行う正しい方法は何ですか?

これは私のトークンオブジェクトがどのように見えるかです:

response.body={"Id":"84f4faf2","TokenValidity":"1.00:00:00","ValidTo":"2013-11-02T04:24:00.0817221Z","Parameters":{"AccountId":"1041"},"Token":"sF6G3czrqZmm70FtDKZxDoNC21tglUvo1+HqraqQU/Y="}

トークンを取得するために、AFHTTPClient をサブクラス化し、Stack Overflow の質問Using AFNetworking and HTTP Basic Authenticationで説明されているようにトークン呼び出しを行いました。

現在、応答本文を id 応答オブジェクトに保存し、そのオブジェクトから NSUserDefault を作成し、それを呼び出そうとしました。

これがトークンを取得する方法です

SBAPIManager.h

#import "AFHTTPClient.h"
#import <AFNetworking/AFHTTPClient.h>

@interface SBAPIManager : AFHTTPClient
-(void)setUsername:(NSString *)username andPassword:(NSString *)password;
- (void)setAuthorizationHeaderWithToken:(NSString *)token;
+(SBAPIManager *)sharedManager;

@end

SBAPIManager.m

#import "SBAPIManager.h"
#import "AFNetworking/AFJSONRequestOperation.h"
#import "AFNetworking/AFNetworkActivityIndicatorManager.h"

@implementation SBAPIManager
#pragma mark - Methods
-(void)setUsername:(NSString *)username andPassword:(NSString *)password
{
    [self clearAuthorizationHeader];
    [self setAuthorizationHeaderWithUsername:username password:password];
}

-(void)setAuthorizationHeaderWithToken:(NSString *)token
{
    [self setAuthorizationHeaderWithToken:token];
}

#pragma mark - initialization
-(id)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];
    if (!self)
        return nil;
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];
        [self setParameterEncoding:AFJSONParameterEncoding];
        [[AFNetworkActivityIndicatorManager sharedManager]setEnabled:YES];

    return self;
}

#pragma mark - singleton methods
+(SBAPIManager *)sharedManager
{
    static dispatch_once_t pred;
    static SBAPIManager *_sharedManager =nil;

    dispatch_once(&pred, ^{_sharedManager =[[self alloc]initWithBaseURL:[NSURL URLWithString:@"https://qstage.azurewebsites.net"]]; });
    return _sharedManager;
}

@end

ViewController.m

        [[SBAPIManager sharedManager]setUsername:_nickname andPassword:_StoreIdentifierForVendor];

        [[SBAPIManager sharedManager]getPath:@"/Accounts/Token" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

            NSUserDefaults *TokenSession = [NSUserDefaults standardUserDefaults ];
            [TokenSession setObject:responseObject forKey:@"TOKEN"];

            NSLog(@"JSON");
            NSLog(@"token %@",[self Token]);
        } failure:^(AFHTTPRequestOperation *operation,NSError *error) {
            //Error stuff here
        }];

    } failure:nil];
}

TokenSession オブジェクトを作成した後、TokenSession にBase64エンコードを行い、API 呼び出しを行う直前に setAuthorizationHeaderWithToken メソッドで使用します。しかし、[__NSCFDictionary dataUsingEncoding:]: unrecognized selector sent to instance エラーが発生します。したがって、これを修正しようとする前に、私が行っている方法が API 呼び出しを行う正しい方法であるかどうかを誰かに教えていただければ幸いです。

4

1 に答える 1

0

受け取ってユーザーのデフォルトに保存するのresponseObjectは辞書です (JSON を自動的に逆シリアル化するように AFNetworking を構成しているため)。そのため、文字列として使用すると例外が発生します。

ダウンロードを完了して JSON 文字列を取得するか、使用する前に辞書 ( NSJSONSerialization) を文字列に再シリアル化する必要があります。

于 2013-11-02T15:26:49.193 に答える