我有一个像这样的请求对象:
@interface MyUpdate
@property (nonatomic, copy) NSString* name;
@property (nonatomic, assign) int value;
@end
@interface MyRequest
@property (nonatomic, assign) int index;
@property (nonatomic, retain) MyUpdate* update;
@end
我正在使用RKObjectMapping和RKObjectSerializer来创建JSON字符串并在POST中使用它:
RKObjectMapping* updateMapping = [RKObjectMapping mappingForClass:[MyUpdate class]];
[updateMapping mapForKeyPath:@"name" toAttribute:@"Name"];
[updateMapping mapForKeyPath:@"value" toAttribute:@"Value"];
RKObjectMapping* requestMapping = [RKObjectMapping mappingForClass:[MyRequest class]];
[requestMapping mapForKeyPath:@"index" toAttribute:@"Index"];
[requestMapping mapKeyPath:@"update" toRelationship:@"Update" withMapping:updateMapping];
RKObjectSerializer* serializer = [RKObjectSerializer serializerWithObject:request mapping:requestMapping];
[[RKClient sharedClient] post:requestPath params:[serializer serializationForMIMEType:RKMIMETypeJSON error:nil] delegate:self];
request
是我MyRequest
课程的一个实例。 requestPath
只是NSString
。
我一直收到这个错误,说明一个密钥对MyUpdate无效,即使我已将其映射。我是否错过了使用RKObjectMapping的一些关键步骤?
答案 0 :(得分:0)
我使用“RKObjectLoader”来完成这项工作。这是一个例子:
MyUpdate *myUpdate = [[MyUpdate alloc] init];
[[RKClient sharedClient].HTTPHeaders setValue:RKMIMETypeJSON forKey:@"Content-Type"];
// Prepare the request
NSMutableDictionary *requestDictionary = [[NSMutableDictionary alloc] init];
[requestDictionary setObject:yourIndexVar forKey:@"Index"];
[requestDictionary setObject:fileName forKey:@"fileName"];
NSError* error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:requestDictionary options:NSJSONWritingPrettyPrinted error:&error];
NSString *JSON = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
RKParams *params = [RKRequestSerialization serializationWithData:[JSON dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON];
// Prepare the response mapping
RKObjectMapping* objectMapping = [RKObjectMapping mappingForClass:MyUpdate class]];
[objectMapping mapKeyPath:@"name" toAttribute:@"Name"];
[objectMapping mapForKeyPath:@"value" toAttribute:@"Value"];
[objectMapping mapKeyPath:@"update" toRelationship:@"Update" withMapping:objectMapping];
RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"BASE_URL"];
[manager setClient:[RKClient sharedClient]];
[manager.mappingProvider setMapping:objectMapping forKeyPath:@"****Result"];
RKObjectLoader *objectLoader = [manager loaderWithResourcePath:@"RELATIVE_PATH"];
// For example:
// BASE_URL = "http://mysite.com/"
// RELATIVE_PATH (service end-point uri) = "/ServiceName/SaveFile/"
// **** = "SaveFile"
objectLoader.targetObject = myUpdate;
objectLoader.method = RKRequestMethodPOST;
objectLoader.params = params;
objectLoader.delegate = self;
@try
{
[objectLoader send];
}
@catch (NSException *exception)
{
NSLog(@"NSException - Name: %@, Reason: %@", exception.name, exception.reason);
}