- 关键HTTP响应头信息
- Content - Length:表示整个资源的长度(以字节为单位)。知道资源的总长度对于断点续传很重要,因为它可以让客户端知道需要下载的数据总量,从而判断当前已下载部分和剩余部分。
- Content - Range:这个头信息指示了部分响应的范围。例如,格式为
Content - Range: bytes x - y / z
,其中x
是当前部分的起始字节,y
是当前部分的结束字节,z
是整个资源的长度。这对于断点续传中确定当前下载的位置和剩余需要下载的部分很关键。
- 在Objective - C代码中获取并处理响应头信息
- 获取响应头信息:
在使用
NSURLSession
进行网络请求时,可以通过NSURLSessionDataTask
的NSURLResponse
来获取响应头。示例代码如下:
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"your_download_url"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!error && response) {
NSDictionary *headers = [response allHeaderFields];
// 获取Content - Length
NSString *contentLengthStr = headers[@"Content - Length"];
NSInteger contentLength = [contentLengthStr integerValue];
// 获取Content - Range
NSString *contentRangeStr = headers[@"Content - Range"];
}
}];
[task resume];
- 处理响应头信息以实现断点续传:
假设已经记录了之前下载的字节数为
downloadedBytes
。当获取到Content - Range
头信息时,需要解析它来确定当前下载的位置和剩余需要下载的部分。
// 解析Content - Range
NSArray *components = [contentRangeStr componentsSeparatedByString:@" "];
if (components.count >= 2) {
NSString *rangeComponent = components[1];
NSArray *rangeSubComponents = [rangeComponent componentsSeparatedByString:@"/"];
if (rangeSubComponents.count >= 2) {
NSString *currentRange = rangeSubComponents[0];
NSArray *startEnd = [currentRange componentsSeparatedByString:@"-"];
NSInteger start = [startEnd[0] integerValue];
NSInteger end = [startEnd[1] integerValue];
NSInteger totalLength = [rangeSubComponents[1] integerValue];
// 检查是否与之前记录的下载位置相符等逻辑
// 调整请求头,添加Range头来实现断点续传
NSString *rangeHeader = [NSString stringWithFormat:@"bytes=%zd -", downloadedBytes];
NSMutableURLRequest *mutableRequest = [request mutableCopy];
[mutableRequest setValue:rangeHeader forHTTPHeaderField:@"Range"];
// 重新发起请求继续下载
NSURLSessionDataTask *newTask = [session dataTaskWithRequest:mutableRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 处理新的下载数据等
}];
[newTask resume];
}
}