2012-02-03 13 views
5

私はhudson URLアドレスからJSONを取得し、HTTP認証を使用して自分の(Mac OS X)アプリケーションを認証しようとしています。AFNetworkingでHTTP認証を使用してJSONを取得

私が使用している例を次に示します。

// AppDelegate.m 
- (void) doSomething { 
    [[CommAPIClient sharedClient] getPath:@"/computer/api/json" parameters:nil 
success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Name: %@", [responseObject valueForKeyPath:@"totalExecutors"]); 

    } failure:nil]; 
} 

// CommAPIClient.m 
+ (CommAPIClient *) sharedClient { 
    static CommAPIClient *_sharedClient = nil; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken, ^{ 
     AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate]; 
     _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString: [appDelegate.hudsonTextField stringValue]]]; 
    }); 
    return _sharedClient; 
} 

- (id) initWithBaseURL:(NSURL *)url { 
    self = [super initWithBaseURL:url]; 
    if (self){ 
     [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 

     AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate]; 
     userName = [appDelegate.userTextField stringValue]; 
     password = [appDelegate.passwdTextField stringValue]; 

     [self setAuthorizationHeaderWithUsername:userName password:password]; 
     [self setDefaultHeader:@"Accept" value:@"application/json"]; 
    } 
    return self; 
} 

を、私は私のドロップダウンリストに表示するコンピュータのリストを取得したいのですが、この2行が一緒に動作しません: [自己setAuthorizationHeaderWithUsername:ユーザー名パスワード:パスワードを]; [self setDefaultHeader:@ "受け入れる"値:@ "application/json"];私は、キーを取得しようとするので、私はちょうど最初の行、私のautheticationの作品を使用しますが、私はそのエラーを受け取った場合

:二行目を使用している場合

2012-02-03 02:43:57.542 HudsonSlave[7523:707] An uncaught exception was raised 
2012-02-03 02:43:57.542 HudsonSlave[7523:707] [<NSConcreteData 0x100850000> valueForUndefinedKey:]: this class is not key value coding-compliant for the key totalExecutors. 

2012-02-03 02:43:57.623 HudsonSlave[7523:707] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSConcreteData 0x100850000> valueForUndefinedKey:]: this class is not key value coding-compliant for the key totalExecutors.' 

、私の認証がエラー403を返します。

誰でも問題を解決できますか?

ありがとう、ご迷惑をおかけして申し訳ありません。

チアゴ

+0

両方の行を使用するとどうなりますか? – mattt

+0

@mattt、エラーは私にコンテンツタイプが見つからないと言ったので、私は3行目を追加しました: [self setDefaultHeader:@ "Content-Type" value:@ "application/json"]; とエラーである: エラードメイン= com.alamofire.networking.errorコード= -1016「期待するコンテンツタイプ{( "テキスト/ javascriptの"、 "アプリケーション/ JSON"、 "テキスト/ JSON" )}、アプリケーション/ JavaScriptを持っ」のUserInfo = 0x100513190 {NSLocalizedDescription =期待されるコンテンツ・タイプ{( "テキスト/ javascriptの"、 "アプリケーション/ JSON"、 "テキスト/ JSON" )}、アプリケーション/ JavaScriptを得、NSErrorFailingURLKey = http://hudson.concretecorp.com.br/computer/api/json} – unnamedd

答えて

7

"期待するコンテンツタイプ{( "テキスト/ javascriptの"、 "アプリケーション/ JSON"、 "テキスト/ JSON")}、得アプリケーション/ javascriptの"

同じようエラーは、、application/json、またはtext/jsonのいずれかが要求されていましたが、サーバーがapplication/javascript(JSONのMIMEタイプが間違っています)というメッセージが表示されています。

サーバが正しいMIMEタイプで応答するようにするか、アクセシブルなMIMEタイプを指定するAFJSONRequestOperationの行を手動で変更します(おそらく簡単です)。サブクラス化を含むライブラリコードを変更するには、よりハッキリしない選択肢がありますが、それはおそらくあなたのケースでは価値があるよりもずっと面倒です。

+0

「AFHTTPCLient」に 'Content-Type'ヘッダーを設定する必要はありません。これは、リクエストパラメータがシリアル化される方法に応じて自動的に設定されます。 – mattt

14

Flickr APIでこの問題が発生し、AFJSONRequestOperationのサブクラス化が終わってしまいました。あなたするだけ例えばthuslyクラスメソッドdefaultAcceptableContentTypes、上書き:

[self registerHTTPOperationClass:[CCFFlickrJSONRequestOperation class]]; 

UPDATE 2013-09-:

+ (NSSet *)defaultAcceptableContentTypes; 
{ 
    return [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil]; 
} 

はその後、私のAFHTTPClientサブクラスでは、私はデフォルトのHTTP操作クラスとしての私のサブクラスを登録します09 14-52-47:

ではなく、全体AFJSONのサブクラスの1時間のことだ場合はメソッド名が今+ (NSSet *)acceptableContentTypes

+0

多くのソリューションを試した後、AFJSONRequestOperationをサブクラス化し、defaultAcceptableContentTypesをオーバーライドするのが最もクリーンで優れた回避策でした。ありがとうございました! – DZenBot

+5

'AFNetworking 1.0RC1'のように見えるこのメソッド名は' +(NSSet *)acceptableContentTypes'に変更されました – bearMountain

+0

side note:@ "text/html"を追加する必要がある場合もあります – BabyPanda

4

ですRequestOperationオブジェクトあなただけの何が必要に直接許容できるコンテンツの種類を設定することができます

AFJSONRequestOperation *operation = blah blah blah 

[operation setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain",@"text/html", nil]]; 

[operation start]; 
+0

setAcceptableContentTypesはAFNetworking 1.1 –

5

実際にあなたが今簡単に、より多くのコンテンツ・タイプを追加することができますAFNetworking 2のよう

[AFHTTPRequestOperation addAcceptableContentTypes:[NSSet setWithObjects:@"text/html", nil]]; 
+2

どこに置くのが適切ですか? – Shmidt

+0

良い質問、シュミット。 – Morkrom

2

を。0の場合、シリアライズはもはやRequestOperationクラスの一部ではなく、シリアライザクラスに委譲されます。 2.0を使用する場合は、このようなことをしたいと考えています(一般的には、の代わりに acceptableContentTypesを置き換えるのが最良の解決策だと思います)。

AFHTTPRequestOperationManager *requestManager = [AFHTTPRequestOperationManager manager]; 

NSMutableSet *contentTypes = [requestManager.responseSerializer.acceptableContentTypes mutableCopy]; 
[contentTypes addObject:@"text/html"]; 
[contentTypes addObject:@"text/plain"]; 
// ... etc ... 
requestManager.responseSerializer.acceptableContentTypes = [contentTypes copy]; 

AFHTTPRequestOperationオブジェクトを直接使用する場合は、「requestManager.responseSerializer」を「myOperationObject.responseSerializer」に置き換えてください。

+0

ありがとうbro.working –

関連する問題