具有令牌认证的NSURLSession

ele*_*nag 10 objective-c ios ios7 nsurlsession

我在我的iOS项目中有以下代码,我想转换为使用NSURLSession而不是NSURLConnection.我正在查询REST API哪个使用基于令牌的HTTP Authentication方案,但我找不到如何做的示例.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];

NSString *username = [[NSUserDefaults standardUserDefaults] stringForKey:@"Username"];

NSString *token = //GET THE TOKEN FROM THE KEYCHAIN


NSString *authValue = [NSString stringWithFormat:@"Token %@",token];
[request setValue:authValue forHTTPHeaderField:@"Authorization"];


if ([NSURLConnection canHandleRequest:request]){
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    [NSURLConnection sendAsynchronousRequest:request queue:self.fetchQueue
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

                               if (!connectionError) {
                                   NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                                   if (httpResponse.statusCode == 200){
                                       NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:nil];

                                       //Process the data
                                   }
                               }

                           }];
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*een 21

您可以使用NSURLSession重写它,如下所示

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

    NSString *token ; //GET THE TOKEN FROM THE KEYCHAIN

    NSString *authValue = [NSString stringWithFormat:@"Token %@",token];

    //Configure your session with common header fields like authorization etc
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    sessionConfiguration.HTTPAdditionalHeaders = @{@"Authorization": authValue};

    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSString *url;
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];

    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
        if (!error) {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
            if (httpResponse.statusCode == 200){
                NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:nil];

                //Process the data
            }
        }

    }];
    [task resume];
Run Code Online (Sandbox Code Playgroud)

  • NSMutableURLRequest的文档说:`重要信息NSURLConnection类和NSURLSession类旨在为您处理HTTP协议的各个方面.因此,您不应修改以下标题:授权,...`(参见:[doc](https://developer.apple.com/library/IOs/documentation/Cocoa/Reference/Foundation/Classes/NSMutableURLRequest_Class /index.html#//apple_ref/occ/instm/NSMutableURLRequest/addValue:forHTTPHeaderField :)).但是如果没有[request setValue:...]那么怎么做呢? (12认同)
  • "NSURLSessionConfiguration"的文档也说了同样的事情:`NSURLSession对象旨在为您处理HTTP协议的各个方面.因此,您不应修改以下标题:授权,...`([doc](https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSURLSessionConfiguration_class/#//apple_ref/ OCC/instp/NSURLSessionConfiguration/HTTPAdditionalHeaders)).你的方法安全吗? (9认同)