首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行HTTP请求,然后执行HTTP请求

执行HTTP请求,然后执行HTTP请求
EN

Stack Overflow用户
提问于 2014-01-06 23:13:47
回答 1查看 343关注 0票数 0

我是iOS中处理连接的初学者。我想执行一个POST请求和一个对url的GET请求。问题是,我需要首先完成POST,以便能够在JSON中得到解析的访问令牌,该令牌稍后将放置在get请求的头中,这样我就可以检索所需的登录数据。我使用的是自定义委托方法,但是当我运行这个方法时,GET请求比POST执行得早,所以在完成get之前无法获得密钥。有什么方法可以先发帖子然后再发邮件吗?这是我的代码:

代码语言:javascript
复制
- (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];

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 05:06:01

您不需要将这两种方法全部调用在一起。

代码语言:javascript
复制
[self httpPostWithCustomDelegate];
[self sendHTTPGet];

你同时提出两个请求。但是哪一种反应将是第一位的,你无法确定。因为您需要来自"POST“请求的数据才能发出"GET”请求。做这样的事:

代码语言:javascript
复制
-(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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20961057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档