6

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

私が使用している例に従って:

// 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行が一緒に機能しません。[self setAuthorizationHeaderWithUsername:userName password:password]; [self setDefaultHeader:@ "Accept" value:@ "application / json"];

最初の行だけを使用すると、認証は機能しますが、キーを取得しようとしたため、そのエラーが発生します。

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.'

2行目を使用すると、認証でエラー403が返されます。

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

英語の誤りをお詫び申し上げます。

チアゴ

4

5 に答える 5

14

私は Flickr API でこの問題に遭遇し、最終的にサブクラスAFJSONRequestOperation化しましたが、それは些細なことであることが判明しました。したがって、クラスメソッドをオーバーライドするだけで済みますdefaultAcceptableContentTypes。次に例を示します。

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

次に、AFHTTPClient サブクラスで、サブクラスをデフォルトの HTTP 操作クラスとして登録します。

[self registerHTTPOperationClass:[CCFFlickrJSONRequestOperation class]];

更新 2013-09-09 14-52-47:

メソッド名は現在+ (NSSet *)acceptableContentTypes

于 2012-02-03T12:18:56.120 に答える
7

「予期されるコンテンツ タイプ {( "text/javascript", "application/json", "text/json" )}、取得した application/javascript」

エラーが言ったように、リクエストはtext/javascriptapplication/json、またはのいずれかを予期していtext/jsonましたが、サーバーが送信しましたapplication/javascript(これは JSON の不適切な MIME タイプです)。

サーバーが正しい MIME タイプで応答するようにするか、(おそらくより簡単に)AFJSONRequestOperationアクセス可能な MIME タイプを指定する行を手動で変更します。サブクラス化を伴うライブラリ コードの変更に代わるハックの少ない代替手段がありますが、それはおそらくあなたの場合の価値よりもはるかに面倒です。

于 2012-02-03T06:23:53.657 に答える
5

実際には、より多くのコンテンツ タイプを簡単に追加できるようになりました。

[AFHTTPRequestOperation addAcceptableContentTypes:[NSSet setWithObjects:@"text/html", nil]];
于 2012-12-03T19:56:03.303 に答える
4

AFJSONRequestOperation オブジェクト全体をサブクラス化するのではなく、一度だけ行う場合は、必要なコンテンツ タイプを直接設定できます。

AFJSONRequestOperation *operation = blah blah blah

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

[operation start];
于 2012-04-30T17:37:45.200 に答える
2

AFNetworking 2.0 の時点で、シリアライゼーションは RequestOperation クラスの一部ではなくなり、Serializer クラスに委譲されています。2.0 を使用する場合、次のようなことを行います (一般的には、 acceptableContentTypes を置き換えるのではなく拡張するのが最善の解決策だと思います。将来の AFNetworking SDK バージョンでどのような基本値が使用されるかはわかりません)。

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」に置き換えてください。

于 2014-02-14T17:45:50.403 に答える