2014-04-08 187 views
1

我基本上構建我的應用程序,就像您可以從AFNetworking 2.0 GitHub下載的AFNetworking示例一樣。但是,在過去的AFNetworking 1.0中,當我做了一個客戶端網絡擴展類時,我不得不指定initWithBaseURL,我可以設置可接受的內容類型。AFNetworking 2.0設置內容類型

在2.0中,似乎在該示例中不再有此實例方法。所以,當我使用網絡服務,我得到錯誤[1] (null) @"NSLocalizedDescription" : @"Request failed: unacceptable content-type: text/html"

我試過不使用AFClient類的方法,它的工作原理,但我想設置它像例子,所以我可以有更好的代碼重用。

我在哪裏可以設置contentType?此外,在2.0的例子中,它們有一個塊調用 + (NSURLSessionDataTask *)globalTimelinePostsWithBlock:(void (^)(NSArray *posts, NSError *error))block {在返回類型爲void之前。返回NSURLSessionDataTask的目的是什麼?

+1

關於你提到的關於第二個問題'globalTimelinePostsWithBlock',如果你看一下它是如何在演示中使用,你會看到,他們再通過任務對象,以'UIAlertView中+ AFNetworking'方法'showAlertViewForTaskWithErrorOnCompletion'。如果你沒有得到任務對象,你就無法做到這一點。事實上,這是AFNetworking 1.x方法(比如'+ [AFHTTPClient getPath:...]')的問題之一,他們在真正需要返回對象的情況下使用了'void'。 – Rob

+0

@Rob感謝你的迴應,所以它基本上是說如果在通話中有錯誤,顯示一個alertview?這真的有什麼大的優勢嗎?我不能只在'if(!error)'之後放一個'else',並用'[error description]'顯示一個'UIAlertview',就像在AF1.0中完成的那樣? – Alan

+1

我可以看到的唯一明顯的優勢是,如果任務已添加到後臺會話中(因爲獲取任務標識符是在應用程序重新啓動後重新實例化警報的唯一方法,但您必須存儲任務標識符在持久存儲中)。無論如何,我認爲作爲一個通用的設計原則,總是返回相關的對象是有意義的,因爲你永遠不知道你將來何時需要它。我認爲1.x在許多應該返回對象的情況下返回void。這在2.0中得到了一些補救。 – Rob

回答

6

您響應的內容類型是text/html。

爲了得到它,設置你的AFHTTPSessionManager的一樣,響應串行:

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

,或者你可以嘗試

manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
+1

我相信你肯定會想要做後者,因爲前者會影響接受的內容類型,但不會停止默認的序列化器, 'AFJSONResponseSerializer',試圖將響應解析爲JSON。通過完全改變'responseSerializer',就像在第二個例子中一樣,你可以繞過這個問題。 – Rob

+0

@Damien但我在哪裏添加這一點的代碼?我知道在哪裏添加它,如果我只是創建一個AFSessionManager對象並對其進行設置,但是因爲我像這個例子那樣做了AFHTTPSessionManager,所以它被'AFAppDotNetAPIClient'分類。我不確定在哪裏設置responseSerializer。我嘗試使用代碼_sharedClient.responseSerializer = [AFHTTPREsponseSerializer serializer]'將其放在'sharedClient'類方法的子類中,但它不起作用。 – Alan

+1

@alan你回答了你的問題;) –

1

想通了。

我在分配之前設置responseSerializer ... -_-。你需要把它放在他的sharedClient類方法中。

+ (instancetype)sharedClient { 
static AFMobileClient *_sharedClient = nil; 
static dispatch_once_t onceToken; 


//_sharedClient.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 
dispatch_once(&onceToken, ^{ 

    _sharedClient = [[AFMobileClient alloc] initWithBaseURL:[NSURL URLWithString:BaseURLString]]; 
    //_sharedClient.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; 
    _sharedClient.responseSerializer = [AFHTTPResponseSerializer serializer]; 
}); 

return _sharedClient; 
}