Objective-C 使用 header 发送获取方法来下载文件

Objective-C send get method with header to download file

在我的 osx 应用程序中,我想从网站下载文件,为此,我首先尝试使用 NSData dataWithContentsOfURL:url 但我正在通过 API,所以我需要在我的 GET 请求的 header 中发送一个令牌,所以现在,我下载文件的方法是:

-(void)downloadFile:(NSString*)name from:(NSString*)stringURL in:(NSString*)path{
    NSURL *aUrl = [NSURL URLWithString:stringURL];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    [request setHTTPMethod:@"GET"];
    [request addValue:self.token forHTTPHeaderField:@"Authorization"];

    NSLog(@"%@", stringURL);
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];

    if ( data )
    {
        NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString  *documentsDirectory = [paths objectAtIndex:0];

        NSString  *filePath = [NSString stringWithFormat:@"%@/%@.torrent", path,name];
        [data writeToFile:filePath atomically:YES];
    }
}

记录的url是好的。但是数据变量是零,错误一个包含代码为 1002 的 NSURLErrorDomaincode。参考文档:

Returned when a properly formed URL cannot be handled by the framework. The most likely cause is that there is no available protocol handler for the URL.

那么我如何发送带有自定义 headers 的 GET 请求,然后下载文件?

你的代码有一些错误:

  1. documentsDirectory没有用到,所以数据写不到哪里去了
  2. 默认的 HTTP 方法是 GET 所以你不需要指定它。
  3. 您应该完整传递 URL:http://api.t411.io/torrents/download/4693572。而且我还以为你之前可能传入了api.t411.io/torrents/download/4693572.

我建议您使用 Apple 在 iOS 7 和 OS X v10.9 中引入的 NSURLSession API。

// in viewDidLoad
- (void)viewDidLoad {
  [super viewDidLoad];
  _config = [NSURLSessionConfiguration defaultSessionConfiguration];
  _config.HTTPAdditionalHeaders = @{@"Authorization": self.token};
  _session = [NSURLSession sessionWithConfiguration:_config];
}

- (void)downloadFile:(NSString*)name from:(NSString*)stringURL in:(NSString*)path {
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

  NSURLSessionDataTask *task = [_session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    if (error) {
      NSLog(@"%@", error);
      return;
    }

    if (data) {

      // Your file writing code here
      NSLog(@"%@", data);
    }
  }];

  [task resume];
}