使用RestKit的RKObjectMapping和RKObjectSerializer进行RKClient post参数时出错

时间:2012-06-01 19:29:00

标签: iphone objective-c json restkit

我有一个像这样的请求对象:

@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的一些关键步骤?

1 个答案:

答案 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);
     }