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 请求,然后下载文件?
你的代码有一些错误:
documentsDirectory
没有用到,所以数据写不到哪里去了
- 默认的 HTTP 方法是 GET 所以你不需要指定它。
- 您应该完整传递 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];
}
在我的 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 请求,然后下载文件?
你的代码有一些错误:
documentsDirectory
没有用到,所以数据写不到哪里去了- 默认的 HTTP 方法是 GET 所以你不需要指定它。
- 您应该完整传递 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];
}