2012-06-01 19 views
0

我有這樣一個請求對象,以便:使用RestKit的RKObjectMapping和RKObjectSerializer爲RKClient之後的參數時,遇到了一個錯誤

@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

我使用「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); 
    } 
相關問題