使用AFHTTPClient下载图像

时间:2013-08-27 09:01:43

标签: objective-c afnetworking afhttpclient

我正在尝试从具有AFNetworking的服务器下载jpeg文件。 它似乎成功访问服务器,但responseObject为空。

以下是相关代码:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:"https://api.test.info/"];
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setDefaultHeader:@"Accept" value:@"application/json"];
[client setParameterEncoding:AFJSONParameterEncoding];
[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];

[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"image/jpeg"]];
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];

[client getPath:@"image/number1" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject){
    NSData *test = responseObject;
    NSLog(@"%@", responseObject);
    NSLog(@"%@", test);
    [self.imgProfile setImage:[UIImage imageWithData:test]];
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
}];

此代码的输出是: (空值) (空)

这意味着responseObject和test是空对象。 如果我在浏览器中使用相同的URL,我可以轻松地恢复图片。 用户名和密码有效,因为其他请求有效。

我需要更改哪些内容才能下载图片?

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您告诉客户端使用JSON请求。 JSON不是图像。

如果您想要NSData,那么您可以这样做......

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:"https://api.test.info/"];
[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];

[client getPath:@"image/number1" parameters:nil success:^(AFHTTPRequestOperation *operation, NSData responseObject){
    [self.imgProfile setImage:[UIImage imageWithData:responseObject]];
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
}];

或者,如果self.imgProfile是UIImageView,那么它就更容易了......

[self.imgProfile setImageWithURL:[NSURL URLWithString:@"https://api.test.info/image/number1"]];

虽然不知道如何使用授权。

实际上,这是做什么......

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:"https://api.test.info/"];
[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];

NSURLRequest *request = [client requestWithMethod:@"GET" path:@"image/number1" parameters:nil];

[self.imgProfile setImageWithURLRequest:request placeholderImage:nil success:nil failure:nil];

答案 1 :(得分:0)

我认为Fogmeister的解决方案也应该有效,因为他处理每个请求都是NSData。而不是注册AFHTTPOperationClasses。

我的解决方案:

  1. [self registerHTTPOperationClass:[AFImageRequestOperation class]];

  2. 请确保您的网址使用附加信息

  3. 这是我的情况:

    我有一个API,我可以从中请求数据和图像,以便访问数据和图像,我需要在标题中设置用户名和密码。最好(唯一?)方法是通过继承AFHTTPClient并在整个应用程序中将其用作单例。

    我必须收到的JSON数据一切正常,但几天前我想要请求图片。好的图片显然不是JSON-Data,但是我试图通过我的单身人士请求它们。

    请求成功,但我的responseObject中没有数据。

    首先,谷歌和阅读,stackoverflow和阅读...不是真的有用,因为我发现的可能性都没有使用身份验证。

    那我该怎么办?

    我尝试将AFImageRequestOperation类注册为HTTPClient的HTTPOperationClass。

    [self registerHTTPOperationClass:[AFImageRequestOperation class]];
    

    这没有帮助,因为方法

    + (BOOL)canProcessRequest:(NSURLRequest *)urlRequest
    
    AFImageRequestOperation的

    仅检查网址的扩展名

    我正在调用的URL没有任何扩展名。 首先,我快速定制AFJSONRequestOperation,以便它也可以返回图像,如NSData。只是为了检查其他一切是否正常。

    现在我告诉我的同事稍微更改API,以便我可以使用后缀“jpg”调用URL。

    现在一切正常。

    只想告诉某个地方!如果有人遇到同样的问题。