RestKit est un framework de mapping objet JSON à partir de requêtes REST :
Exemple de mise en oeuvre pour gérer la création de compte utilisateur, modification, authentification
RestKit est un framework de mapping objet JSON à partir de requêtes REST :
Exemple de mise en oeuvre pour gérer la création de compte utilisateur, modification, authentification :
On gère le mapping de 3 POJO :
- User : L'utilisateur
- Success : Un message de réussite de la requête REST
- Error : Un message d'échec de le requête REST
Dans le Header :
Il y a 3 protocoles de délégations de définis, à utiliser dans le code de l'application qui a besoin de ces services REST :
//
// Serveur.h
// Human-Client
//
// Created by Benoît Desnos on 26/12/12.
// Copyright (c) 2012 Benoît Desnos. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "User.h"
#import "Error.h"
#import "Success.h"
@protocol CreateAccountDelegate
@required
-(void)createAccountSuccess : (Success * )success;
-(void)createAccountFailure : (Error * )error;
@end
@protocol LoginAccountDelegate
@required
-(void)loginAccountSuccess : (Success * )success;
-(void)loginAccountFailure : (Error * )error;
@end
@protocol UpdateAccountDelegate
@required
-(void)updateAccountSuccess : (Success * )success;
-(void)updateAccountFailure: (Error * ) error;
@end
@interface Serveur : NSObject
{
NSString * login;
NSString * password;
}
@property (nonatomic, copy) NSString *login;
@property (nonatomic, copy) NSString *password;
+(Serveur*)sharedManager;
-(void) createAccount:(User *) user
delegate:(id<CreateAccountDelegate>)delegate;
-(void) loginAccountDelegate:(id<LoginAccountDelegate>)delegate;
-(void) updateAccount:(User *) user
delegate:(id<UpdateAccountDelegate>)delegate;
@end
Dans le Source :
Lors l'initialisation du singleton, on défini le mapping à opérer.
Les diverses fonctions permettent d'utiliser très facilement le modèle distant.
//
// Serveur.m
// Opinion-Client
//
// Created by Benoît Desnos on 26/12/12.
// Copyright (c) 2012 Benoît Desnos. All rights reserved.
//
#import "Serveur.h"
#import <RestKit/RestKit.h>
#import "User.h"
#import "Error.h"
#import "Success.h"
@implementation Serveur
@synthesize login;
@synthesize password;
static Serveur* sharedManager = nil;
static NSString * url = @"http://192.168.0.29:8080/Opinion-Server-Mongo/";
+(Serveur*)sharedManager
{
@synchronized(sharedManager) {
if (!sharedManager) {
sharedManager = [[[self class] alloc] init];
}
}
return sharedManager;
}
-(id)init
{
self = [super init];
if (self != nil)
{
RKLogConfigureByName("RestKit", RKLogLevelOff);
RKLogConfigureByName("RestKit/Network*", RKLogLevelOff);
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelOff);
//let AFNetworking manage the activity indicator
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
// Initialize HTTPClient
NSURL *baseURL = [NSURL URLWithString:url];
AFHTTPClient* client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
//we want to work with JSON-Data
[client setDefaultHeader:@"Accept" value:RKMIMETypeJSON];
[client setDefaultHeader:@"Content-Type" value:RKMIMETypeJSON];
// Initialize RestKit
RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client];
[RKObjectManager setSharedManager:objectManager];
[RKObjectManager sharedManager].requestSerializationMIMEType = RKMIMETypeJSON;
RKObjectMapping *requestUserMapping = [RKObjectMapping requestMapping];
[requestUserMapping addAttributeMappingsFromDictionary:@{
@"email" : @"email",
@"password" : @"password"
}];
RKRequestDescriptor *requestUserDescriptor = [RKRequestDescriptorrequestDescriptorWithMapping:requestUserMapping
objectClass:[User class]
rootKeyPath:@"user"];
RKObjectMapping *responseUserMapping = [RKObjectMapping mappingForClass:[User class]];
[responseUserMapping addAttributeMappingsFromDictionary:@{
@"email" : @"email",
@"password" : @"password"
}];
RKResponseDescriptor *responseUserDescriptor = [RKResponseDescriptorresponseDescriptorWithMapping:responseUserMapping
pathPattern:nil
keyPath:@"user"
statusCodes:[NSIndexSet indexSetWithIndex:200]];
[objectManager addRequestDescriptor:requestUserDescriptor];
[objectManager addResponseDescriptor:responseUserDescriptor];
RKObjectMapping *requestErrorMapping = [RKObjectMapping requestMapping];
[requestErrorMapping addAttributeMappingsFromDictionary:@{
@"code" : @"code",
@"title" : @"title",
@"details" : @"details",
}];
RKRequestDescriptor *requestErrorDescriptor = [RKRequestDescriptorrequestDescriptorWithMapping:requestErrorMapping
objectClass:[Error class]
rootKeyPath:@"error"];
RKObjectMapping *responseErrorMapping = [RKObjectMapping mappingForClass:[Error class]];
[responseErrorMapping addAttributeMappingsFromDictionary:@{
@"code" : @"code",
@"title" : @"title",
@"details" : @"details",
}];
RKResponseDescriptor *responseErrorDescriptor = [RKResponseDescriptorresponseDescriptorWithMapping:responseErrorMapping
pathPattern:nil
keyPath:@"error"
statusCodes:[NSIndexSet indexSetWithIndex:400]];
[objectManager addRequestDescriptor:requestErrorDescriptor];
[objectManager addResponseDescriptor:responseErrorDescriptor];
RKObjectMapping *requestSuccessMapping = [RKObjectMapping requestMapping];
[requestSuccessMapping addAttributeMappingsFromDictionary:@{
@"code" : @"code",
@"title" : @"title",
@"details" : @"details",
}];
RKRequestDescriptor *requestSuccessDescriptor = [RKRequestDescriptorrequestDescriptorWithMapping:requestSuccessMapping
objectClass:[Success class]
rootKeyPath:@"success"];
RKObjectMapping *responseSuccessMapping = [RKObjectMapping mappingForClass:[Success class]];
[responseSuccessMapping addAttributeMappingsFromDictionary:@{
@"code" : @"code",
@"title" : @"title",
@"details" : @"details",
}];
RKResponseDescriptor *responseSuccessDescriptor = [RKResponseDescriptorresponseDescriptorWithMapping:responseSuccessMapping
pathPattern:nil
keyPath:@"success"
statusCodes:[NSIndexSet indexSetWithIndex:200]];
[objectManager addRequestDescriptor:requestSuccessDescriptor];
[objectManager addResponseDescriptor:responseSuccessDescriptor];
}
return self;
}
-(void) createAccount:(User *) user
delegate:(id<CreateAccountDelegate>)delegate
{
[[RKObjectManager sharedManager] postObject:user
path:@"/Opinion-Server-Mongo/public/user"
parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
{
Success * s = [mappingResult firstObject];
[delegate createAccountSuccess:s];
}
failure:^(RKObjectRequestOperation *operation, NSError *error)
{
Error * e = [[error.userInfo objectForKey:RKObjectMapperErrorObjectsKey] objectAtIndex:0];
[delegate createAccountFailure:e];
}];
}
-(void) loginAccountDelegate:(id<LoginAccountDelegate>)delegate
{
[[[RKObjectManager sharedManager]HTTPClient] setAuthorizationHeaderWithUsername:login password:password];
NSLog(@"login : %@", self.login);
NSLog(@"pass : %@", self.password);
[[RKObjectManager sharedManager] getObjectsAtPath:@"/Opinion-Server-Mongo/private/user/login"
parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
{
Success * s = [mappingResult firstObject];
//NSLog(@"mappingResult : %@",mappingResult);
//NSLog(@"user : %@",u);
[delegate loginAccountSuccess:s];
}
failure:^(RKObjectRequestOperation *operation, NSError *error)
{
Error * e = [[error.userInfo objectForKey:RKObjectMapperErrorObjectsKey] objectAtIndex:0];
[delegate loginAccountFailure:e];
}];
}
-(void) updateAccount:(User *) user
delegate:(id<UpdateAccountDelegate>)delegate
{
[[[RKObjectManager sharedManager]HTTPClient] setAuthorizationHeaderWithUsername:login password:password];
NSLog(@"login : %@", self.login);
NSLog(@"pass : %@", self.password);
[[RKObjectManager sharedManager] putObject:user
path:[NSString stringWithFormat:@"/Opinion-Server-Mongo/private/user/"]
parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
{
Success * s = [mappingResult firstObject];
[delegate updateAccountSuccess:s];
}
failure:^(RKObjectRequestOperation *operation, NSError *error)
{
Error * e = [[error.userInfo objectForKey:RKObjectMapperErrorObjectsKey] objectAtIndex:0];
[delegate updateAccountFailure:e];
}];
}
@end
Utilisation :
Dans le Header :
Déclarer les protocoles à utiliser, ici LoginAccountDelegate : (un protocole est le pendant d'une Interface en Java)
@interface AppDelegate : UIResponder <UIApplicationDelegate,LoginAccountDelegate>
Déclaration des fonctions associées :
-(void)loginAccountSuccess:(Success *)success;
-(void)loginAccountFailure:(NSString *)error;
Dans le Source :
Au moment d'envoyer ses infos au serveur REST:
[[Serveur sharedManager] loginAccountDelegate:self]; // AppDelegate déclare LoginAccountDelegate, le self passe donc.
PI : "self" est le "this" de java.
Ensuite, il faut implémenter les fonctions de Succès/Echec de l'appel :
-(void)loginAccountSuccess:(Success *)success
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success"
message:[success description]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
-(void)loginAccountFailure:(Error *)error
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Mauvais login / mot de passe"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
Plus d'infos sur : http://restkit.org
CASEROLE PLASTIC
"/>…