0

我正在尝试使用 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);
}];

此代码的输出是: (null) (null)

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

我需要更改什么才能下载图像?

任何帮助表示赞赏。

4

2 回答 2

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];
于 2013-08-28T09:04:21.917 回答
0

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

我的解决方案:

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

  2. 确保您的 URL 使用扩展名

这是我的情况:

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

对于我必须接收的 JSON 数据,一切正常,但几天前我想请求图片。好吧,图片显然不是 JSON 数据,但尽管如此,我还是尝试通过我的单身人士来请求它们。

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

第一件事,谷歌和阅读,stackoverflow 和阅读…… 不是很有帮助,因为我发现的可能性都是在不使用身份验证的情况下工作的。

那我做了什么?

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

[self registerHTTPOperationClass:[AFImageRequestOperation class]];

那没有帮助,因为方法

+ (BOOL)canProcessRequest:(NSURLRequest *)urlRequest

AFImageRequestOperation 只检查URL 的扩展名

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

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

现在一切正常。

只是想在某个地方告诉这个!万一有人遇到同样的问题。

于 2013-08-28T12:28:01.360 回答