2013-01-10 25 views
0

當我做一個得到這樣如何使用Restkit 0.10.X爲POST JSON和地圖響應

//Query Parameters for Login: Email and Password 
NSDictionary *queryParams; 
queryParams = [NSDictionary dictionaryWithObjectsAndKeys: email,@"email",password,@"password", nil]; 
RKObjectManager *objectManager = [RKObjectManager sharedManager]; 

//Pointing to the login query in the server 
RKURL *URL = [RKURL URLWithBaseURL:[objectManager baseURL] resourcePath:@"/default/api/login.json" queryParameters:queryParams]; 
[objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@?%@", [URL resourcePath], [URL query]] delegate:self]; 

和使用這樣的映射:

//Creamos un mapeo para el Login mapping 
RKObjectMapping *sessionMapping = [RKObjectMapping mappingForClass:[UrSession class]]; 
[sessionMapping mapKeyPathsToAttributes:@"uid", @"uid", @"token", @"token", nil]; 
[objectManager.mappingProvider setMapping:sessionMapping forKeyPath:@"result"]; 

一切正常,響應從服務器映射到我的Object UrSession。

但是現在我們需要更改客戶端,因爲服務器需要POST而不是GET來登錄。 好吧,那麼這是我的代碼:

RKClient *myClient = [RKClient sharedClient]; 

NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; 

//User and password params 
[params setObject:password forKey:@"password"]; 
[params setObject:email forKey:@"email"]; 


//Parsing rpcData to JSON! 
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:RKMIMETypeJSON]; 
NSError *error = nil; 
NSString *json = [parser stringFromObject:params error:&error]; 

//If no error we send the post, voila! 
if (!error){ 
    [myClient post:@"/default/api/loginPost.json" params:[RKRequestSerialization serializationWithData:[json dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON] delegate:self]; 
} 

好了,直到這裏的一切都OK。 服務器對我的POST響應,但我的代碼不映射此響應!!爲什麼?我知道我正在損失一些東西,但我無法理解爲什麼使用GET Restkit從服務器映射JSON,但使用GET時卻沒有。

我有點絕望,因爲我找不到適合我的代碼的解決方案。

謝謝你的幫助。


最後是這樣的代碼:

NSMutableDictionary *paramsDic = [[NSMutableDictionary alloc] init]; 

//User and password params 
[paramsDic setObject:password forKey:@"password"]; 
[paramsDic setObject:email forKey:@"email"]; 

//Parsing to JSON 
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:RKMIMETypeJSON]; 
NSError *error = nil; 
NSString *json = [parser stringFromObject:paramsDic error:&error]; 
RKParams *params = [RKRequestSerialization serializationWithData:[json dataUsingEncoding:NSUTF8StringEncoding]MIMEType:RKMIMETypeJSON]; 

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"loginPost.json" usingBlock:^(RKObjectLoader * loader) 
{ 
    loader.method = RKRequestMethodPOST; 
    loader.params = params; 
    loader.delegate = self; 
    }]; 

回答

0

如果您使用RKClient不會被映射到一個對象響應的請求。您必須使用RKObjectManager進行映射。

您可以通過使用塊這樣做與方法loadObjectAtResourcePath POST請求:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/path" usingBlock:^(RKObjectLoader * loader) 
    { 
       loader.method = RKRequestMethodPost; 
       loader.params = [RKRequestSerialization serializationWithData:[requestString dataUsingEncoding:NSUTF8StringEncoding MIMEType:RKMIMETypeJSON]; 
       loader.delegate = self; 
    }]; 

的響應將被映射到你的對象。

+0

謝謝弗拉德,你救了我的命:)。我已經發布了代碼,也許可以對具有相同問題的其他人有用。 –