2013-08-27 29 views
0

我正在嘗試使用AFNetworking從服務器上下載jpeg文件。 它似乎成功訪問服務器,但responseObject是空的。用AFHTTPClient下載圖像

以下是相關的代碼:這個代碼的

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和測試都是空的對象。 如果我在瀏覽器中使用相同的URL,我可以輕鬆地將圖片返回。 用戶名和密碼有效,因爲其他請求正常工作。

我需要更改什麼來下載圖像?

任何幫助表示讚賞。

+0

在這裏,你告訴它它將下載JSON。 JSON不是(也不能保存)圖像。 – Fogmeister

回答

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]; 
+0

感謝您的解決方案。但幾乎在同一時間我制定了錯誤。看看我的答案。 – dfinki

0

我覺得Fogmeister的解決方案應太,因爲他處理每一個請求爲NSData的。而不是註冊AFHTTPOperationClasses。

我的解決辦法:

  1. [自registerHTTPOperationClass:[AFImageRequestOperation類]];

  2. 確保您的網址使用擴展名

這是我的情況:

我有我從中請求數據和圖像的API,以訪問數據和圖像,我需要在頭設置的用戶名和密碼。最好的(唯一的)方法是通過繼承AFHTTPClient並在整個應用程序中將其用作單例。

一切工作正常的JSON數據我不得不接受,但前幾天我想請求圖片。那麼圖片顯然不是JSON-Data,但是我試圖通過我的單身人士請求他們。

請求成功,但我的responseObject中沒有數據。

首先,谷歌和閱讀,stackoverflow和閱讀...不是很有幫助,因爲我發現工作的可能性都沒有使用身份驗證。

那我做了什麼?

我試着爲我的HTTPClient註冊類AFImageRequestOperation作爲HTTPOperationClass。

[self registerHTTPOperationClass:[AFImageRequestOperation class]]; 

沒有幫助,因爲該方法

+ (BOOL)canProcessRequest:(NSURLRequest *)urlRequest 
AFImageRequestOperation只檢查了 擴展程序的網址

而我打電話的網址沒有任何擴展名。 首先,我快速定製AFJSONRequestOperation,以便它可以返回圖像,作爲NSData。只是爲了檢查一切是否正常。

現在我告訴我的同事稍微更改一下API,以便我可以調用帶有後綴「jpg」的URL。

現在一切正常。

只是想告訴這個地方!如果有人遇到同樣的問題。

+0

我的方法是記錄的方法。好吧。如果它有效。 – Fogmeister