2011-12-10 39 views
1

我做的圖像數據的多部分的發佈和使用RestKit的RKClient像這樣映射一些值:如何RKClient的RKResponse與RKObjectMapping

RKParams* params = [RKParams params]; 
[params setValue:foo.accountId forParam:@"accountId"]; 
[params setValue:foo.identifier forParam:@"fooId"]; 
[params setValue:_photoId forParam:@"photoId"]; 
[params setData:data MIMEType:@"image/png" forParam:@"image"]; 
[[RKClient sharedClient] post:@"/foo/uploadPhoto" params:params delegate:self]; 

這個偉大的工程,我的後端服務器與JSON表示響應服務器端模型對象,它看起來像這樣:

{"id":"4ee2b4670364720c089e75b9","accountId":"4ebee3469ae2d8adf983c561","fooId":"4ec0983d036463d900841f0b","photoId":"E5B20AF1-9F10-4175-8262-852BDA3DEDE9","filename":"4ebee3469ae2d8adf983c561_4ec0983d036463d900841f0b_E5B20AF1-9F10-4175-8262-852BDA3DEDE9","contentType":"image/png"} 

我現在需要做的是將此映射到我的客戶端(iOS)模型對象。客戶端模型對象幾乎相同,但不完全相同(因此使用RKJSONParser的objectFromString方法不是一種選擇),因此我定義了一個自定義的RKObjectMapping來處理映射。 RKClient的委託只能得到一個RKResponse,所以我怎樣才能使用響應和映射器來獲取我的客戶端模型對象的一個​​實例?

注意:爲了清楚起見,我非常熟悉在使用RKObjectManager發佈對象並映射響應時它是如何工作的。我的情況的獨特之處在於我使用RKClient來實現多部分帖子。不幸的是,RKClient似乎沒有簡單的方法來處理像RKObjectManager那樣的響應映射......除非我錯過了某些東西(我希望和你們都會爲我指出)。

回答

1

好,this post was similar(但無功能),它給了我使用的RKObjectLoader這種方法

- (RKObjectLoader *)postObject:(id<NSObject>)object delegate:(id<RKObjectLoaderDelegate>)delegate block:(void (^) (RKObjectLoader *))block 

所以現在我能得到映射,這不是明顯的好處的一種新技術的一些想法如何使用RKClient。

路由器設置:

RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kApiUrlBase]; 
[objectManager.router routeClass:[PAPetPhoto class] toResourcePath:@"/pet/uploadPhoto" forMethod:RKRequestMethodPOST]; 

映射設置:

RKObjectMapping *papetPhotoMapping = [RKObjectMapping mappingForClass:[PAPetPhoto class]]; 
[papetPhotoMapping mapKeyPath:@"id" toAttribute:@"identifier"]; 
[papetPhotoMapping mapAttributes:@"accountId", @"petId", @"photoId", @"filename", @"contentType", nil]; 
[objectManager.mappingProvider addObjectMapping:papetPhotoMapping]; 
[objectManager.mappingProvider setSerializationMapping:[papetPhotoMapping inverseMapping] forClass:[PAPetPhoto class]]; 
[objectManager.mappingProvider setMapping:papetPhotoMapping forKeyPath:@"petPhoto"]; 

的職位:(注意,因爲我建立了我的塊中的所有PARAMS我的對象只是一個虛擬實例來觸發正確的路由和映射器)。

PAPetPhoto *photo = [[PAPetPhoto alloc] init]; 
    [[RKObjectManager sharedManager] postObject:photo delegate:self block:^(RKObjectLoader *loader){ 

     RKParams* params = [RKParams params]; 
     [params setValue:pet.accountId forParam:@"accountId"]; 
     [params setValue:pet.identifier forParam:@"petId"]; 
     [params setValue:_photoId forParam:@"photoId"]; 
     [params setValue:_isThumb ? @"THUMB" : @"FULL" forParam:@"photoSize"]; 
     [params setData:data MIMEType:@"image/png" forParam:@"image"]; 

     loader.params = params; 
    }]; 

服務器端點(Java中,Spring MVC的)

@RequestMapping(value = "/uploadPhoto", method = RequestMethod.POST) 
    @ResponseBody 
    public Map<String, Object> handleFormUpload(@RequestParam("accountId") String accountId, 
            @RequestParam("petId") String petId, 
            @RequestParam("photoId") String photoId, 
            @RequestParam("photoSize") PhotoSizeEnum photoSize, 
            @RequestParam("image") Part image) throws IOException { 

     if (log.isTraceEnabled()) 
      log.trace("uploadPhoto. accountId=" + accountId + " petId=" + petId + " photoId=" + photoId + " photoSize=" + photoSize); 

     PetPhoto petPhoto = petDao.savePetPhoto(accountId, petId, photoId, photoSize, image); 

     Map<String, Object> map = GsonUtils.wrapWithKeypath(petPhoto, "petPhoto"); 
     return map; 
    } 

服務器響應JSON(注意 「petPhoto」 對應於映射設置的的keyPath):

{ 
    petPhoto =  { 
     accountId = 4ebee3469ae2d8adf983c561; 
     contentType = "image/png"; 
     filename = "4ebee3469ae2d8adf983c561_4ec0983d036463d900841f09_3FED4959-1042-4D8B-91A8-76AA873851A3"; 
     id = 4ee2e80203646ecd096d5201; 
     petId = 4ec0983d036463d900841f09; 
     photoId = "3FED4959-1042-4D8B-91A8-76AA873851A3"; 
    }; 
} 

代表:

- (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object { 

    if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) { 
     PAPetPhoto *photo = (PAPetPhoto*)object; 
    } 
} 
+0

我在我的登錄頁面上嘗試了這一點,併到達了將請求發送到指定路由的地步。但即使輸入了正確的參數(電子郵件和密碼),登錄也會失敗。我懷疑params設置沒有通過,但我不確定是什麼原因。它工作正常,如果我使用RKClient後:params:方法。 :( – Hlung

相關問題