2014-01-06 4 views
0

Я начинаю работать с соединениями в iOS. Я хочу выполнить запрос POST и запрос GET на URL. Дело в том, что мне нужно сначала выполнить POST, чтобы я мог получить токен доступа, проанализированный в JSON, который позже поместит в заголовок запроса GET, чтобы я мог получить нужные мне данные для входа. Я использую пользовательские методы делегирования, но когда я запускаю это, запрос GET выполняется раньше, чем POST, поэтому я не могу получить ключ до завершения GET. Есть ли способ выполнить POST сначала, а затем GET? Вот мой код:Выполните запрос HTTP POST, а затем запрос HTTP GET

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 

//params 
self.user = @"carlos"; 
self.pass = @"1234"; 
self.grantType = @"password"; 
self.clientId = @"7da713e69afc96cf894e"; 
self.clientSecret = @"2c14ec54cfdfd6faec4ef56ca7f0870ab83f820b"; 

// Set the side bar button action. When it's tapped, it'll show up the sidebar. 
self.sideBarButton.target = self.revealViewController; 

self.sideBarButton.action = @selector(revealToggle:); 

// Set the gesture 
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; 

[self httpPostWithCustomDelegate]; 

[self sendHTTPGet]; 

} 


-(void) httpPostWithCustomDelegate 
{ 
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; 

NSURL * url = [NSURL URLWithString:@"http://192.237.241.175:8090/oauth2/access_token/"]; 
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url]; 
NSString * params =[NSString stringWithFormat:@"&username=%@&password=%@&grant_type=%@&client_id=%@&client_secret=%@&scope=write",self.user,self.pass,self.grantType,self.clientId,self.clientSecret]; 
[urlRequest setHTTPMethod:@"POST"]; 
[urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; 

NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest 
                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                 NSLog(@"Retrieving Data"); 
                 // NSLog(@"Response:%@ %@\n", response, error); 
                 if(error == nil) 
                 { 
                  //Test Display 
                  //                NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
                  //                NSLog(@"Data = %@",text); 

                  self.responseDataPost = [[NSMutableData alloc] init]; 
                  [self.responseDataPost appendData:data]; 

                  NSError *error; 

                  NSMutableDictionary *receivedData = [NSJSONSerialization JSONObjectWithData:self.responseDataPost options:NSJSONReadingMutableContainers error:&error]; 

                  //obtener del dictionary el access token y meter como header Authorization Bearer + id 

                  //NSArray *accessToken = [receivedData valueForKeyPath:@"access_token"]; 

                  self.connTxtPost.text = [receivedData valueForKeyPath:@"access_token"]; 
                  self.recData = [receivedData valueForKeyPath:@"access_token"]; 

                 } 

                }]; 
[dataTask resume]; 

} 

-(void) sendHTTPGet 
{ 
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]]; 

NSURL * url = [NSURL URLWithString:@"http://192.237.241.175:8090/snippets/"]; 

NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url]; 

[urlRequest setHTTPMethod:@"GET"]; 
self.connTxtGet.text = self.recData ; 

[urlRequest setValue:self.recData forHTTPHeaderField:@"Authorization"]; 


NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest 
                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                 //NSLog(@"Response:%@ %@\n", response, error); 
                 if(error == nil) 
                 { 
                  NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
                  NSLog(@"Data = %@",text); 

                 } 

                }]; 

[dataTask resume]; 

} 

ответ

0

Вам не нужно созывать эти два метода вместе.

[self httpPostWithCustomDelegate]; 
[self sendHTTPGet]; 

Вы делаете два запроса одновременно. Но какой ответ наступит первым, вы не сможете его определить. Поскольку вам нужны данные из запроса «POST» для запроса «GET». Сделайте что-то вроде этого:

-(void) httpPostWithCustomDelegate{ 
    ............. 
    NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest 
               completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                 ................... 
                 ................... 
                 self.connTxtPost.text = [receivedData valueForKeyPath:@"access_token"]; 
                 self.recData = [receivedData valueForKeyPath:@"access_token"]; 
                 [self sendHTTPGet]; 
                } 

               }]; 
    [dataTask resume]; 
    } 

Это позволит убедиться, когда вы сделаете запрос «GET» у вас есть «access_token». Надеюсь, что все будет хорошо. :)

+0

Отлично !!! Работала очень хорошо !!! Большое спасибо!!! (: –

+0

Добро пожаловать .. :) – Rashad