2012-05-25 37 views
0

現在我正在爲我的代碼做一個巨大的重構,並且我想統一使用Restkit的方式。我分開了對我的API服務器和REST調用進行RPC調用的方法。使用RKParams向API發佈帖子並使用RestKit將響應映射到RKObjectMapping

REST調用其中使用objectMapping和RPC調用使用RKClient進行的調用。除此之外,我使用的是塊而不是代表,這很好,但我對它的工作原理有些懷疑。

這是我以前的代碼,很好地發佈對象並使用委託手動執行映射,之後是使用不發送參數的塊的新代碼。

//This was the old way... 
- (void) upload: (KFMedia *) pic { 

    RKParams* imageParams = [RKParams params]; 
    NSData* imageData = UIImageJPEGRepresentation(pic.image, 0.7f); 
    [imageParams setData:imageData MIMEType:@"image/jpg" forParam:@"FileUpload"]; 

    [[RKClient sharedClient] post:@"/api/upload/" params:imageParams delegate:self]; 

} 

//This is the new way I'm trying... 
- (void) upload: (KFMedia *) pic onLoad:(RKObjectLoaderDidLoadObjectBlock) loadBlock onError:(RKRequestDidFailLoadWithErrorBlock)failBlock{ 

    RKParams* imageParams = [RKParams params]; 
    NSData* imageData = UIImageJPEGRepresentation(pic.image, 0.7f); 
    [imageParams setData:imageData MIMEType:@"image/jpg" forParam:@"FileUpload"]; 

    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/api/upload/" usingBlock:^(RKObjectLoader *loader) { 

     //Trying to set params here, but it seems that I'm not sending anything :(
     loader.params = imageParams; 
     loader.objectMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[KFMedia class]]; 
     loader.delegate = self; 
     loader.onDidLoadObject = loadBlock; 
     loader.onDidFailWithError = failBlock; 
     loader.onDidFailLoadWithError = failBlock; 
     loader.onDidLoadResponse = ^(RKResponse *response) { 
      [self fireErrorBlock:failBlock onErrorInResponse:response]; 
     }; 

    }]; 

} 

我發送的請求有它的主體爲空,這意味着參數沒有被髮送或設置正確。任何想法如何讓這個工作?

回答

0

我剛解決了這個問題。與loadObjectsAtResourcePath發送額外參數必須強制使用

loader.method = RKRequestMethodPOST; 

的代碼如下帖子:

- (void) upload: (KFMedia *) pic onLoad:(RKObjectLoaderDidLoadObjectBlock) loadBlock onError:(RKRequestDidFailLoadWithErrorBlock)failBlock{ 

    RKParams* imageParams = [RKParams params]; 
    NSData* imageData = UIImageJPEGRepresentation(pic.image, 0.7f); 
    [imageParams setData:imageData MIMEType:@"image/jpg" forParam:@"FileUpload"]; 

    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/api/upload/" usingBlock:^(RKObjectLoader *loader) { 

     loader.method = RKRequestMethodPOST; //This line solved the problem 
     loader.params = imageParams; 
     loader.objectMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[KFMedia class]]; 
     loader.delegate = self; 
     loader.onDidLoadObject = loadBlock; 
     loader.onDidFailWithError = failBlock; 
     loader.onDidFailLoadWithError = failBlock; 
     loader.onDidLoadResponse = ^(RKResponse *response) { 
      [self fireErrorBlock:failBlock onErrorInResponse:response]; 
     }; 

    }]; 

}