IOS : Utilisation de RestKit

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 (nonatomiccopyNSString *login;

@property (nonatomiccopyNSString *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 classallocinit];

        }

    }

    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 allocinitWithBaseURL:baseURL];

        //we want to work with JSON-Data

        [client setDefaultHeader:@"Accept" value:RKMIMETypeJSON];

        [client setDefaultHeader:@"Content-Type" value:RKMIMETypeJSON];

        

        // Initialize RestKit

        RKObjectManager *objectManager = [[RKObjectManager allocinitWithHTTPClient: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 sharedManagerpostObject: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:RKObjectMapperErrorObjectsKeyobjectAtIndex:0];

 

        [delegate createAccountFailure:e];

    }];

 

}

 

-(void) loginAccountDelegate:(id<LoginAccountDelegate>)delegate

{

 

    [[[RKObjectManager sharedManager]HTTPClientsetAuthorizationHeaderWithUsername:login password:password];

    

    NSLog(@"login : %@"self.login);

    NSLog(@"pass : %@"self.password);

    

    [[RKObjectManager sharedManagergetObjectsAtPath:@"/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:RKObjectMapperErrorObjectsKeyobjectAtIndex:0];

 

         [delegate loginAccountFailure:e];

     }];

 

}

 

-(void) updateAccount:(User *) user

             delegate:(id<UpdateAccountDelegate>)delegate

{

    [[[RKObjectManager sharedManager]HTTPClientsetAuthorizationHeaderWithUsername:login password:password];

    

    NSLog(@"login : %@"self.login);

    NSLog(@"pass : %@"self.password);

    

    [[RKObjectManager sharedManagerputObject: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:RKObjectMapperErrorObjectsKeyobjectAtIndex: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 sharedManagerloginAccountDelegate: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 allocinitWithTitle:@"Success"

                                                    message:[success description]

                                                   delegate:nil

                                          cancelButtonTitle:@"OK"

                                          otherButtonTitles:nil];

    [alert show];

 

}

 

-(void)loginAccountFailure:(Error *)error

{

    UIAlertView *alert = [[UIAlertView allocinitWithTitle:@"Error"

                                                    message:@"Mauvais login / mot de passe"

                                                   delegate:nil

                                          cancelButtonTitle:@"OK"

                                          otherButtonTitles:nil];

    [alert show];

 

Plus d'infos sur : http://restkit.org

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.