6

我正在尝试从我的 hudson url 地址获取 JSON 并使用 HTTP Authenticate 对我的(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;
}

我想让计算机的列表显示在我的下拉列表中,但是这两行不能一起工作: [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.'

如果使用第二行,我的身份验证将返回错误 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,你想做这样的事情(一般来说,我认为这是扩展可接受内容类型而不是替换它的最佳解决方案 - 你永远不知道它在未来的 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 回答