2013-03-11 23 views
5

我正在編寫一個與應用程序交互以更新用戶配置文件的iOS應用程序。爲了更新一個用戶的姓名,iOS應用提出的請求具有以下格式的主體:無法處理成功的204響應並使用RestKit正確映射失敗響應

{"name" : {"first" : "FIRSTNAMEGOESHERE", "lastName":"LASTNAMEGOESHERE"}} 

在請求體是有效的情況下(設置即兩個第一和姓),該服務返回一個204(無內容)狀態碼和一個空響應主體。

在請求正文是無效的情況下(例如,第一名稱缺失等),該服務將返回的400狀態碼和以下列格式的響應體:

{"code":"ERRORCODEHERE"} 

的iOS應用程序正在使用RestKit,我一直無法弄清楚如何讓它正確處理成功和失敗的情況。如果我用這個:

- (void)updateUserName 
{ 
    RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[[NSURL alloc] initWithString:@"http://someqaserver:8080"]]; 
    [objectManager setRequestSerializationMIMEType:RKMIMETypeJSON]; 

    RKObjectMapping *userMapping = [RKObjectMapping requestMapping]; 
    [userMapping addAttributeMappingsFromDictionary:@{@"firstName" : @"first", @"lastName" : @"last"}]; 

    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userMapping objectClass:[OurUser class]          rootKeyPath:@"name"]; 

    [objectManager addRequestDescriptor:requestDescriptor]; 

    [objectManager putObject:[OurUser getCurrentUser] 
        path:@"/mobile/profile/name" 
        parameters:nil 
        success:^(RKObjectRequestOperation *operation, RKMappingResult *result) 
        { 
        NSLog(@"Success!"); 
        } 
        failure:^(RKObjectRequestOperation *operation, NSError *error) 
        { 
        NSLog(@"Fail!"); 
        }]; 
} 

這顯然不會爲錯誤的情況下工作,但它確實成功地在從服務器返回一個204的情況下執行的成功塊。

如果我打電話putObject,錯誤處理廠之前添加以下代碼,但現在的有效204的情況下被認爲是一種失敗:

RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[ServiceError class]]; 
    [errorMapping addAttributeMappingsFromDictionary:@{@"code" : @"errorCode"}]; 
    RKResponseDescriptor *errorDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)]; 
    [objectManager addResponseDescriptor:errorDescriptor]; 

這似乎是因爲公認的HTTP狀態代碼現在設置發生那些提供的響應描述符和204不是其中之一(或者它可能是別的嗎?)

我該如何得到它: 1.)如果204被返回,則被視爲成功 2.)如果返回4XX,它被視爲失敗,並且錯誤代碼正確映射到我的Servi ceError對象?

在此先感謝您提供的任何幫助。

回答

2

的完整列表,請參閱wikipedia的問題也通過添加一個響應描述處理204解決:

RKResponseDescriptor *successResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[RKObjectMapping mappingForClass:nil] 
                           method:RKRequestMethodPUT 
                          pathPattern:nil 
                           keyPath:nil 
                          statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[manager addResponseDescriptor:successResponseDescriptor]; 
0

代碼204不是錯誤,任何2xx狀態都被視爲成功。 204意味着'沒有內容',這是一個完全有效的迴應。 如果您希望restkit將其視爲錯誤,請確保拋出3xx,4xx或5xx錯誤。在你的情況下,你正在使用一個RKStatusCodeClassClientErrorm,這將建議你應該拋出一個4xx錯誤。

的錯誤代碼

+0

我想你誤會了。我知道204是一個有效的迴應。問題是讓代碼將204視爲成功,同時還添加了適當的響應描述符,以便在收到400時將錯誤代碼映射回來。 – Kathleen 2014-05-11 00:13:29