我正在編寫一個與應用程序交互以更新用戶配置文件的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對象?
在此先感謝您提供的任何幫助。
我想你誤會了。我知道204是一個有效的迴應。問題是讓代碼將204視爲成功,同時還添加了適當的響應描述符,以便在收到400時將錯誤代碼映射回來。 – Kathleen 2014-05-11 00:13:29