2017-05-03 4 views
0

Jecomment appeler API de l'API en utilisant le bloc NSURLSession

NSString* FBAuthoValue= @"TESTINGCONSTANT"; 

Le clic de bouton de chargement, il appelle HitLoadAPI

J'appelle mon API comme ci-dessous HitLoadAPI, maintenant si fin à mon serveur mon FBAuthoValue est le changement que j'ai besoin de frapper une autre API pour obtenir la valeur d'actualisation de FBAuthoValue, et définir dans HitLoadAPI.

1) L'utilisateur a frappé HitLoadAPI avec FBAuthoValue = @ valeur "TESTINGCONSTANT", mais comme dans le serveur maintenant FBAuthoValue = @ "NewTestCode", il retourne httpresponsecode 909, sur 909 que je dois appeler refreshFBAuthValue api, et de mettre cette valeur de retour à HitLoadAPI, et l'API fonctionne correctement. 2) si le jeton FBAuthoValue change sur le serveur, appelez l'API refreshFBAuthValue, et sa valeur de retour doit définir et appeler à nouveau HitLoadAPI, sans connaître l'utilisateur.

NOTE: je dois frapper plusieurs API un après l'autre, on suppose API-1, API-2, API-3 et ainsi de suite, et si FBAuthoValue, si une api, les changements dans le serveur alors besoin de rafraîchir que FBAuthoValue et ensuite la même API doivent être appel, sans affecter ou bloquer à l'utilisateur. Je vais récompenser 50 bounty à coup sûr. Vue d'ensemble: Appel API-1, pendant ce temps si le jeton expire, besoin d'appeler le jeton expirer api, et l'API-1 se souviendra à nouveau, sans l'utilisateur appuyez à nouveau sur le bouton Load.

Voici mon code

-(void)HitLoadAPI 
{ 
NSError *error; 

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; 
NSURL *url = [NSURL URLWithString:@"[JSON SERVER"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                 cachePolicy:NSURLRequestUseProtocolCachePolicy 
                timeoutInterval:60.0]; 

[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:FBAuthoValue forHTTPHeaderField:FBAUTH]; 

NSDictionary *mapData = [[NSDictionary alloc] initWithObjectsAndKeys: @"TEST IOS", @"name", 
        @"IOS TYPE", @"typemap", 
        nil]; 
NSData *postData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error]; 
[request setHTTPBody:postData]; 
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
NSDictionary* headers = [(NSHTTPURLResponse *)response allHeaderFields]; 
      //NSLog(@" headers =%@",headers); 
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
      //NSLog(@"response status code: %ld", (long)[httpResponse statusCode]); 

      if([httpResponse statusCode]==909) 
       { 

       FBAuthoValue =[self refreshFBAuthValue]; 
       //what to do here so the current API hit will be call again.... 

       } 


}]; 

[postDataTask resume]; 
} 






-(NSString *) refreshFBAuthValue 
{ 
//hit api to get new refresh token code here need its calling code as well as the block coding cause it response so late which cause return value nil...to HitLoadAPI 
return FBaccess_token; //it will return refresh FBaccess_token code 

} 

Répondre

1

Vous pouvez créer une méthode que vous pouvez utiliser pour appeler une api de partout dans l'application, cette méthode prend le paramètre spécifique à un appel api, comme url api, les données qui sera inclus dans le corps de la requête et un bloc d'achèvement qui sera appelé lorsque fbAuthValue est valide.

-(void)HitAPILoadWithFbAuthValue:(NSString*)fbAuthValue apiUrl:(NSString*)apiUrl postData:(NSDictionary*)dict withCompletion:(void (^)(int statusCode,NSURLResponse * apiResponse,NSError * error))completion{ 
    NSError *error; 

     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
     NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; 
     NSURL *url = [NSURL URLWithString:apiUrl]; 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                cachePolicy:NSURLRequestUseProtocolCachePolicy 
               timeoutInterval:60.0]; 

     [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
     [request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
     [request setHTTPMethod:@"POST"]; 
     [request setValue: fbAuthValue forHTTPHeaderField:FBAUTH]; 

     //post body with dictionary passed as a parameter 
     NSData *postData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; 
     [request setHTTPBody:postData]; 

     NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     NSDictionary* headers = [(NSHTTPURLResponse *)response allHeaderFields]; 
     //NSLog(@" headers =%@",headers); 
     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
     //NSLog(@"response status code: %ld", (long)[httpResponse statusCode]); 

     if([httpResponse statusCode]==909) 
      { 

      FBAuthoValue =[self refreshFBAuthValue]; 
      //what to do here so the current API hit will be call again.... 
      if (FBAuthoValue){ 
       [self HitAPILoadWithFbAuthValue:fbAuthValue apiUrl:apiUrl postData:dict withCompletion:completion]; 
      }else{ 
      } 

      } 
     //if FbAuthValue is valid, call completion block 
     completion((int)[httpResponse statusCode],response, error); 


    }]; 

     [postDataTask resume]; 
    } 

Utilisation
Je suppose que vous écrivez cette méthode dans une classe distincte appelée APIManager. Donc, pour appeler cette méthode en premier créer une instance de l'APIManager et appeler comme ceci:

APIManager *sharedManager = [APIManager sharedInstance] 

    //call API_1 
    [sharedManager HitAPILoadWithFbAuthValue:FBAuthValue apiUrl:@"API_1_URL" postData:dict_for_first_api withCompletion:^(int statusCode, NSURLResponse *apiResponse, NSError *error) { 

    if(error != nil){ 
    //handle error here 
    }else{ 

     //call API_2 
     [sharedManager HitAPILoadWithFbAuthValue:FBAuthValue apiUrl:@"API_2_URL" postData:dict_for_second_api withCompletion:^(int statusCode, NSURLResponse *apiResponse, NSError *error) { 

     }]; 
    } 

}]; 
+0

J'ai une classe commune pour toutes les API de manutention, comment le faire là? – iphonemaclover

+0

La même approche s'appliquera à toutes les méthodes pour l'appeler récursivement pour une condition correspondante. et il doit y avoir un point de sortie dans la méthode pour ne pas entrer dans une boucle. –

+0

need [self thismethodisnotfixecanchange: FBAuthoValue]; – iphonemaclover