2013-10-06 147 views
4

我試圖從AFNetworking 1.3遷移項目到AFNetworking 2.0。問題從AFNetworking 1.3遷移到AFNetworking 2.0

在AFNetworking 1.3的項目,我有這樣的代碼:

- (void) downloadJson:(id)sender 
{ 

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myServer/api/call?param1=string1&param2=string2"]]; 

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 

     // handle success 

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
     NSLog(@"%ld", (long)[response statusCode]); 

     NSDictionary *data = JSON; 
     NSString *errorMsg = [data objectForKey:@"descriptiveErrorMessage"]; 
     // handle failure 

    }]; 

    [operation start]; 

} 

當客戶端發送的格式不正確或不正確參數,服務器會返回一個400錯誤,包括JSON具有「descriptiveErrorMessage一個url 「我在失敗區讀到。我使用這個「descriptiveErrorMessage」來確定URL的錯誤,並在適當的時候給用戶留言。

的代碼從AFNetworking 2.0項目看起來是這樣的:

- (void)downloadJson:(id)sender 
{ 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myServer/api/call?param1=string1&param2=string2"]]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    operation.responseSerializer = [AFJSONResponseSerializer serializer]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

     // handle success 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

     // any way to get the JSON on a 400 error? 

    }]; 

    [operation start]; 
} 

在AFNetworking 2.0項目,我看不出有什麼辦法讓JSON閱讀「descriptiveErrorMessage」服務器發送。我可以從操作中得到NSHTTPURLResponse的響應頭文件,但是就我所能得到的,也許我錯過了一些東西。

有沒有辦法讓失敗塊中的JSON?如果沒有,任何人都可以提出一個更好的方法來做到這一點

在此先感謝您對此問題的任何幫助。

回答

4

我認爲你可以嘗試訪問傳遞的operation參數的responseData屬性給你的失敗塊。

不確定它將包含服務器發回的JSON數據,但所有信息都應該在那裏。

希望它有幫助。

+0

謝謝@sergio,這工作。我錯過了responseData屬性。它來自NSData,但我將其序列化爲JSON並能夠從服務器檢索消息。 – Paul

1

我找到了更好的解決方案。 我已經使用'AFHTTPRequestOperationManager'

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

[manager GET:@"http://localhost:3005/jsondata" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    NSLog(@"Result: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    NSLog(@"Error: %@", [error localizedDescription]); 
}];