2013-03-11 66 views
1

我是想通過繼承AFHTTPClient和設置基本路徑AFNetworking客戶不子類解析響應

#define WineAPIBaseURLString @"http://localhost:3000/" 
@implementation WineAPIClient 

+(id)sharedInstance{ 
    static WineAPIClient *__sharedInstance; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    __sharedInstance = [[WineAPIClient alloc]initWithBaseURL:[NSURL URLWithString:WineAPIBaseURLString]]; 
}); 
return __sharedInstance; 
} 

- (id)initWithBaseURL:(NSURL *)url 
{ 
self = [super initWithBaseURL:url]; 
if(self){ 
    [self setParameterEncoding:AFJSONParameterEncoding]; 
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
} 

return self; 
} 

@end 

現在叫我的視圖控制器內的客戶端是給我怪異的結果來實施AFNetworking客戶端。例如下面的代碼:

[[WineAPIClient sharedInstance] getPath:@"wines" 
           parameters:nil 
           success:^(AFHTTPRequestOperation *operation, id responseObject) { 
             NSLog(@"%@", responseObject); 

           } 
           failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
             NSLog(@"Error fetching wines!"); 
             NSLog(@"%@",error); 
           }]; 

它登錄到控制檯一串數字:

2013-03-11 16:25:36.411 AFNetworking4[1934:1260b] GET 'http://localhost:3000/wines' 
2013-03-11 16:25:36.430 AFNetworking4[1934:f803] <5b0a2020 7b0a2020 2020225f 5f76223a 20302c0a 20202020 225f6964 223a2022 35313131 35656235 37356265 35383766 3034303... 
2013-03-11 16:25:36.429 AFNetworking4[1934:13003] 200 'http://localhost:3000/wines' [0.0173 s] 

我怎樣才能更正正確解析JSON的客戶端?客戶執行過程中是否有錯誤?

需要注意的一件事是,當不使用自定義客戶端時,完全相同的URI工作正常。

即:

NSURL *url = [NSURL URLWithString:@"http://localhost:3000/wines"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    NSLog(@"%@",JSON); 
} failure:nil]; 
[operation start]; 

我使用AFNetworking的0.10.1分支(我必須支持4.x的設備,所以我不能升級...)。

任何想法如何糾正?

非常感謝。

回答

1

謝謝,沒錯!我正在接收NSData而不是解析的JSON。完全錯過了關於這一部分的時候1) HTTP客戶端已經註冊的相應AFHTTPRequestOperation子與

這些內容類型只能返回的請求響應對象的文檔信息 - registerHTTPOperationClass:,和2)請求接受HTTP標頭適用於請求的內容類型 。如果不這樣做,可能會導致獲取成功或失敗回調的getPath方法塊的NSData實例:參數:success:failure。 因此,使用JSON數據時,初始化HTTP客戶端時,請執行[client registerHTTPOperationClass: [AFJSONRequestOperation class]]和[client setDefaultHeader:@「Accept」 value:@「application/json」]。

所以,該修復程序只是簡單地添加接受應用程序/ json默認標題到客戶端。

1

AFJSONParamterEncoding隻影響您通過請求傳遞的參數。它看起來像接收編碼爲NSData的數據。你可以試着用initWithData創建一個NSString,然後記錄它。你也可能想確保你的客戶端正在返回實際的JSON。在紅寶石中,這可能需要一個to_json方法。