2013-03-18 3 views
0

я могу правильно отправить запрос, но после получения ответа я получаюJson Mapping с использованием Restkit v0.20

response.body ={"status":"success","loginToken":"xxxxyyyzzz"} 

но с ошибкой говоря

It Failed: Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "No response descriptors  
match the response loaded." UserInfo=0x2b55b0 {NSErrorFailingURLStringKey=http://192.168.1.71  
/firstyii/index.php?r=site/login, NSLocalizedFailureReason=A 200 response was loaded from the 
URL 'http://192.168.1.71/firstyii/index.php?r=site/login', which failed to match all (1) 
response descriptors: 

<RKResponseDescriptor: 0x2a5860 baseURL=http://192.168.1.71 pathPattern=/firstyii 
/index.php?r=site/login statusCodes=200-299> failed to match: response path '/firstyii 
/index.php?r=site/login' did not match the path pattern '/firstyii/index.php?r=site/login'., 
NSLocalizedDescription=No response descriptors match the response loaded., keyPath=null, 
NSErrorFailingURLKey=http://192.168.1.71/firstyii/index.php?r=site/login, 
NSUnderlyingError=0x2b6070 "No mappable object representations were found at the key paths 
searched."} 

LoginResponse.h

@interface LoginResponse : NSObject 

@property (nonatomic, strong) NSString *status; 

@property (nonatomic, strong) NSString *loginToken; 

+(RKObjectMapping*)defineLoginResponseMapping; 

@end 

LoginResponse.m

#import "LoginResponse.h" 


@implementation LoginResponse 

@synthesize loginToken; 

@synthesize status; 




+(RKObjectMapping*)defineLoginResponseMapping { 

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[LoginResponse class]]; 

[mapping addAttributeMappingsFromDictionary:@{ 
@"status": @"status", 
@"loginToken": @"loginToken", 
    }]; 


return mapping; 

} 

@end 

Код в LoginManager.m

-(void)LoginWithUserName:(NSString *)username password:(NSString*)password { 

LoginRequest *dataObject = [[LoginRequest alloc] init]; 
[dataObject setUsername:username]; 
[dataObject setPassword:password]; 



    NSURL *baseURL = [NSURL URLWithString:@"http://192.168.1.71"]; 

AFHTTPClient * client = [AFHTTPClient clientWithBaseURL:baseURL]; 
    [client setDefaultHeader:@"Accept" value:RKMIMETypeJSON]; 

RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client]; 




[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] 
forMIMEType:@"application/json"]; 


RKObjectMapping *requestMapping = [[LoginRequest defineLoginRequestMapping] inverseMapping]; 

[objectManager addRequestDescriptor: [RKRequestDescriptor 
    requestDescriptorWithMapping:requestMapping objectClass:[LoginRequest class] rootKeyPath:nil 
]]; 
// what to print 
RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); 
RKLogConfigureByName("Restkit/Network", RKLogLevelDebug); 

RKObjectMapping *responseMapping = [LoginResponse defineLoginResponseMapping]; 

[objectManager addResponseDescriptor:[RKResponseDescriptor 
responseDescriptorWithMapping:responseMapping pathPattern:@"/firstyii/index.php?r=site/login" 
keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]]; 


[objectManager setRequestSerializationMIMEType: RKMIMETypeJSON]; 

    [objectManager postObject:dataObject path:@"/firstyii/index.php?r=site/login" 
parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
    NSLog(@"It Worked: %@", [mappingResult array]); 

} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    NSLog(@"It Failed: %@", error); 

}]; 
} 

я думаю, что код, используемый выше, чтобы отобразить ответ с массивом, поэтому мне нужно код, чтобы отобразить простой JSON как этот один response.body = { «статус» : «success», «loginToken»: «logingngngngngngngae»}

+0

Вы не должны читать отображаемый объект из mappingResult? откуда вы получили ответ? – ahmad

+0

Должен ли я явно писать два класса ответа, по одному для каждого ключа, т. Е. Класс для статуса, а другой для loginToken? , а затем в ответном дескрипторе задайте путь к ключу статуса/логина входа и добавьте два дескриптора ответа? –

+0

Предполагая, что вы читаете ответ, как указано в первой строке вашего вопроса. все, что вам нужно сделать, это использовать встроенный парсер JSON или любой другой синтаксический анализатор json, чтобы получить ответ на форму NSdictionaries и NSarrays – ahmad

ответ

0

Такие ответы должны отображаться с использованием сопоставления pathpattern, non keyvalue, упомянутого в https://github.com/RestKit/RestKit/wiki/Object-mapping.

Я использовал pathPattern, имеющий «?» в нем, следовательно, он не соответствовал должным образом. , также путь path shouldnot имеет «/» в начале. приведенный выше код работает отлично, если я изменяю pathPattern на pathPattern: @ "site/login" и postObject to postObject: @ "site/login" и, конечно же, изменил baseurl = @ "http://json.xxxxxxx.xxxxx:8179/jsonresponse/index.php", чтобы не было особых в нем есть символы.

Смежные вопросы