Objective c RestKit图像上传
我正在使用RestKit驱动与web服务器的交互。我正在尝试使用路由将事件对象发布到服务器,并附带一个图像。代码如下:Objective c RestKit图像上传,objective-c,ios,image,upload,restkit,Objective C,Ios,Image,Upload,Restkit,我正在使用RestKit驱动与web服务器的交互。我正在尝试使用路由将事件对象发布到服务器,并附带一个图像。代码如下: RKObjectManager *manager = [RKObjectManager sharedManager]; RKObjectMapping *map = [self eventMapping]; manager.serializationMIMEType = RKMIMETypeFormURLEncoded; map.rootKeyPath = @
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;
}];
如果我使用序列化事件对象创建RKParams的实例,然后添加图像数据并将其指定为RKObjectLoader的params属性,那么所有属性都将成为一个大规模序列化字符串。必须有一种方法来上传图像,而不需要大量的字符串序列化
我还尝试过将NSData属性映射到某个属性,并将UIImage一路转换为NSData,但RestKit抱怨它无法映射。以前有人这样做过吗?我做了类似的事情,结果很好。我知道您的问题是为什么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"];
- (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object {
if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) {
PAPetPhoto *photo = (PAPetPhoto*)object;
}
}
映射设置:
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"];
- (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object {
if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) {
PAPetPhoto *photo = (PAPetPhoto*)object;
}
}
帖子:(注意,因为我在块中建立了所有参数,所以我的对象只是一个虚拟实例,用于触发正确的路由和映射程序)
服务器端点(Java,Spring MVC)
代表:
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"];
- (void) objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object {
if ([objectLoader wasSentToResourcePath:@"/pet/uploadPhoto"]) {
PAPetPhoto *photo = (PAPetPhoto*)object;
}
}
很好用!只需注意一点:试图通过设置RKObjectMapping的rootKeyPath属性将所有内容都限定为“事件”似乎不再有效。这在iOS 6中有效吗?我不断收到一个“RestKit被要求为请求重新传输一个新的正文流。可能是连接错误还是身份验证问题?”