AF网络-setImageWithURL返回401



我有一个UITableView,我正试图用服务器上的照片和其他数据(例如照片评论)填充它。UITableView上的表单元格具有用setImageWithURL:placeHolderImage:设置的UIImageView。问题是只显示占位符图像。

我已经对AFHTTPClient进行了子类化,并且我正在对服务器使用基本身份验证。所以,我正在做这样的事情:

[self setAuthorizationHeaderWithUsername:@"user" password:@"pass"];

当我对服务器执行GET请求时,我得到的是包含数据和图像路径的JSON。在tableView:cellForRowAtIndexPath:方法中,我试图用setImageWithURL:placeHolderImage:设置UIImageView,但每个下载图像的请求都返回401 Authorization Required。

我假设每个对图像URL的调用都不包括我在子类AFHTTPClient中拥有的基本身份验证信息。如果确实是这样的话,有没有办法让setImageWithURL:placeHolderImage:使用包含基本身份验证信息的子类AFHTTPClient?或者,在每次下载图像的调用中,我可以采取其他方法来尊重这个基本身份验证吗?

虽然setImageWithURL:placeHolderImage:是一种非常方便的方法,但您可能也需要使用一些变通方法来实现它。由于图像下载通常不需要身份验证,所以这并不奇怪。您可以更改UIImageView+AFNetworking.m的代码。通过这种方式,您可以使用setAuthorizationHeaderWithUsername方法对自己进行授权。

或者,您可以使用setImageWithURL:placeHolderImage:在这里使用的底层方法,并使用AFImageRequestOperation创建自己的类似类,在其中可以设置适当的授权头。如果选择此选项,请确保实现类似的缓存方法,以使一切尽可能高效。

在AFHTTPClient类的构造函数中添加以下内容:

[self registerHTTPOperationClass:[AFImageRequestOperation class]];

接下来,实现这样一个方法:

- (void) getImageAtPath:(NSString *)path 
{
    NSMutableURLRequest * request = [self requestWithMethod:@"GET" path:path parameters:nil] ;
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"];
    AFHTTPRequestOperation * operation =
    [self HTTPRequestOperationWithRequest:request
                              success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        [buffer setData:[operation responseData]];
        NSLog( @"Got image data with length %d" , [buffer length] ) ;        
        // todo : use image raw data to populate image view
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog( @"unable to get data at %@ from the server %@" , path, [error localizedDescription] ) ;
    }] ;
    [operation start];
}

最新更新