2011-12-08 28 views
10

Web sunucumla etkileşimleri yönlendirmek için RestKit kullanıyorum. Sunucuya POST bir Event nesnesine yönlendiren bir görüntü ile yönlendirmeyi kullanmaya çalışıyorum. kod aşağıdaki gibidir: Ben tefrika Olay nesnesini kullanarak RKParams bir örneğini oluşturursanızRestKit Resim Yükle

RKObjectManager *manager = [RKObjectManager sharedManager]; 

    RKObjectMapping *map = [self eventMapping]; 
    manager.serializationMIMEType = RKMIMETypeFormURLEncoded; 
    map.rootKeyPath = @"event"; 
    [manager.mappingProvider setSerializationMapping:map forClass:[Event class]]; 
    [manager.router routeClass:[Event class] toResourcePath:@"/v1/events.json" forMethod:RKRequestMethodPOST]; 

    [manager postObject:event delegate:self block:^(RKObjectLoader *loader){ 
    RKObjectMapping *serMap = [[[RKObjectManager sharedManager] mappingProvider] serializationMappingForClass:[Event class]]; 
    NSError *error = nil; 
    NSDictionary *d = [[RKObjectSerializer serializerWithObject:event mapping:serMap] serializedObject:&error]; 

    RKParams *p = [RKParams paramsWithDictionary:d]; 
    [p setData:[event imageData] MIMEType:@"image/jpeg" forParam:@"image"]; 
    loader.params = p; 
    }]; 

ardından görüntü veri eklemek ve RKObjectLoader en parametreler mülkiyet olarak atayın, tüm özellikleri tek bir kitlesel tefrika içine girer. Büyük dizge serileştirme olmadan bir görüntü yüklemek için bir yol olmalı.

Ayrıca, bazı özniteliklerle eşlenen bir NSData özelliğine sahip olmayı denedim, bu arada bir UIImage'ı NSData'ya dönüştürdüm, ancak RestKit, eşlenemeyeceğinden şikayet ediyor. Bunu daha önce kim yaptı?

cevap

16

Çok benzer bir şey yaptım ve gayet iyi çalıştı. Sorunun, RKObjectSerializer'ın neden beklediğiniz şekilde çalışmadığı hakkında bir fikriniz olduğunu farkettim, ama belki de kurulumunuzla ilgili bir şey. Çalıştığım bir şeyin temiz bir örneğini vermek için kodumu gönderiyorum. RKObjectSerializer belgelerini okuduktan sonra, RKParams'ınızı neden örneklemde yaptığım gibi doğrudan ayarlamak yerine bu şekilde başlatamadığınızı anlamıyorum.

Yönlendirici kurulumu:

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

Haritalama kurulumu:

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

mesaj: Ben blokta tüm params inşa beri (haber benim nesne sadece bir uygun yönlendirme ve mapper tetiklemek için kukla örneği).

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

Sunucu son nokta (Java, Bahar 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; 
    } 

Sunucu yanıt JSON (not haritalama kurulum karşılık gelen "petPhoto" nin ana yol):

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

Delege:

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

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

Kusursuz çalışıyor! Sadece bir yan not: RKObjectMapping'in rootKeyPath özelliğini ayarlayarak her şeyi "olay" a dahil etmeye çalışmak artık işe yaramıyor gibi görünüyor. – Jacob

+0

Bu, iOS 6'da çalışıyor mu? "RestKit'ten bir istek için yeni bir vücut akışını yeniden iletmesi istendi. Olası bağlantı hatası veya kimlik doğrulama sorunu mu var?" –