RestKit Image Upload

后端 未结 1 468
予麋鹿
予麋鹿 2020-12-23 15:32

I am using RestKit to drive interactions with my web server. I am trying to use routing to POST an Event object to the server with an image attached to it. The code is as fo

相关标签:
1条回答
  • 2020-12-23 16:07

    I did something very similar and it worked out just fine. I realize your question is about why RKObjectSerializer isn't working the way you expect, but maybe it is something else with your setup. I'm posting my code to give a clean example of something that does work. That said, after reading the RKObjectSerializer documentation, I don't see why you couldn't initialize your RKParams that way instead of setting them directly as I do in my example.

    Router setup:

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

    Mapping setup:

    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"];
    

    The post: (notice since I built up all my params in the block my object is just a dummy instance to trigger the proper routing and mapper).

        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;
        }];
    

    Server endpoint (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;
        }
    

    Server response JSON (note the keyPath of "petPhoto" that corresponds to the mapping setup):

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

    Delegate:

    - (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object {
    
        if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) {
           PAPetPhoto *photo = (PAPetPhoto*)object;
        }
    }
    
    0 讨论(0)
提交回复
热议问题