如何从服务器获取 NSURLSession 到 return Content-Length(http header)。 Objective-c、ios
How to get NSURLSession to return Content-Length(http header) from server. Objective-c, ios
我花了很多时间尝试在帖子中找到关于这个问题的各种想法,但没有成功。 当我使用 curl 时,我得到了想要的 header:Content-Length。
这是我最近的尝试(在某处找到):
- (void) trythis {
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myURL];
request.HTTPMethod = @"HEAD";
NSURLSessionDownloadTask *uploadTask
= [session downloadTaskWithRequest:request
completionHandler:^(NSURL *url,NSURLResponse *response,NSError *error) {
NSLog(@"handler size: %lld", response.expectedContentLength);
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
NSDictionary* headers = [httpResponse allHeaderFields];
NSArray *keys = [headers allKeys];
for( NSString *key in keys){
NSLog(@"key: %@ : %@", key, [headers valueForKey:key]);
}
NSLog(@"");
}];
// 5
[uploadTask resume];
}
它returns这些headers:
key: Vary : Accept-Encoding,User-Agent
key: Server : Apache/2.4.12
key: Connection : Keep-Alive
key: Last-Modified : Sat, 13 Jun 2015 23:03:46 GMT
key: Content-Type : audio/mpeg
key: Accept-Ranges : bytes
key: Date : Tue, 12 Apr 2016 17:59:21 GMT
key: Content-Encoding : gzip
使用 curl(在 macbook 上)我得到:
curl -I http://boulderhomegrown.com/fiddletunes/JerusalemRidge-100.mp3
HTTP/1.1 200 OK
Date: Tue, 12 Apr 2016 14:55:17 GMT
Server: Apache/2.4.12
Last-Modified: Sat, 13 Jun 2015 23:03:46 GMT
ETag: "2ec0bc0-1a172e-5186e3ca6b55f"
Accept-Ranges: bytes
Content-Length: 1709870
Vary: Accept-Encoding,User-Agent
Content-Type: audio/mpeg
注意 Content-Length!!当然,url 在两者中都是相同的。它是我 objective-c.
中的一个实例变量
默认情况下,您发送的请求有 header - Accept-Encoding :gzip、deflate 和服务器 apache 在这种情况下不添加 header content-length (默认情况下用于较大的文件)。因此,如果您将 header 替换为 value: identity。它将提供文件的正确大小。
代码如下:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myURL];
request.HTTPMethod = @"HEAD";
[request addValue:@"identity" forHTTPHeaderField:@"Accept-Encoding"];
只需添加该字段,您就可以像 curl -I 一样在响应中获得正确的 header。
我花了很多时间尝试在帖子中找到关于这个问题的各种想法,但没有成功。 当我使用 curl 时,我得到了想要的 header:Content-Length。
这是我最近的尝试(在某处找到):
- (void) trythis {
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myURL];
request.HTTPMethod = @"HEAD";
NSURLSessionDownloadTask *uploadTask
= [session downloadTaskWithRequest:request
completionHandler:^(NSURL *url,NSURLResponse *response,NSError *error) {
NSLog(@"handler size: %lld", response.expectedContentLength);
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
NSDictionary* headers = [httpResponse allHeaderFields];
NSArray *keys = [headers allKeys];
for( NSString *key in keys){
NSLog(@"key: %@ : %@", key, [headers valueForKey:key]);
}
NSLog(@"");
}];
// 5
[uploadTask resume];
}
它returns这些headers:
key: Vary : Accept-Encoding,User-Agent key: Server : Apache/2.4.12 key: Connection : Keep-Alive key: Last-Modified : Sat, 13 Jun 2015 23:03:46 GMT key: Content-Type : audio/mpeg key: Accept-Ranges : bytes key: Date : Tue, 12 Apr 2016 17:59:21 GMT key: Content-Encoding : gzip
使用 curl(在 macbook 上)我得到:
curl -I http://boulderhomegrown.com/fiddletunes/JerusalemRidge-100.mp3
HTTP/1.1 200 OK Date: Tue, 12 Apr 2016 14:55:17 GMT Server: Apache/2.4.12 Last-Modified: Sat, 13 Jun 2015 23:03:46 GMT ETag: "2ec0bc0-1a172e-5186e3ca6b55f" Accept-Ranges: bytes Content-Length: 1709870 Vary: Accept-Encoding,User-Agent Content-Type: audio/mpeg
注意 Content-Length!!当然,url 在两者中都是相同的。它是我 objective-c.
中的一个实例变量默认情况下,您发送的请求有 header - Accept-Encoding :gzip、deflate 和服务器 apache 在这种情况下不添加 header content-length (默认情况下用于较大的文件)。因此,如果您将 header 替换为 value: identity。它将提供文件的正确大小。
代码如下:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myURL];
request.HTTPMethod = @"HEAD";
[request addValue:@"identity" forHTTPHeaderField:@"Accept-Encoding"];
只需添加该字段,您就可以像 curl -I 一样在响应中获得正确的 header。