나는 아주 비슷한 것을했고 그것은 정상적으로 작동했습니다. 귀하의 질문에 대한 RKObjectSerializer가 당신이 기대하는 방식으로 작동하지 않는 이유에 대해 알고 있지만 어쩌면 그것은 당신의 설정과 다른 것입니다. 작동하는 무언가를 깨끗하게 보여주기 위해 코드를 게시하고 있습니다. 즉, RKObjectSerializer 설명서를 읽은 후 RKParams를 직접 설정하지 않고 왜 내 예제 에서처럼 초기화 할 수 없었는지 알 수 없습니다.
라우터 설정 :
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;
}];
서버 엔드 포인트 (자바, 스프링 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"의 키 패스) :
{
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;
}
}
완벽하게 작동합니다! 한 가지주의 사항 : RKObjectMapping의 rootKeyPath 속성을 설정하여 "이벤트"에 이르기까지 모든 것을 스코프하려고하면 더 이상 작동하지 않는 것 같습니다. – Jacob
iOS 6에서이 기능이 작동합니까? "RestKit에 요청시 새 본문 스트림을 다시 전송하라는 요청을 받았습니다. 가능한 연결 오류 또는 인증 시도가 있습니까?" –