当前位置: 首页 > 知识库问答 >
问题:

如何让NSURLSession从服务器返回Content-Length(http头)。Objective-c,ios

咸高谊
2023-03-14

我花了很多时间尝试在这个问题的帖子中找到的各种想法,但没有成功。当我使用curl时,我会得到所需的头:content-length。

这里是我的最新尝试(在SO的某处找到):

- (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];
}

返回这些头:

Key:Vary:Accept-Encoding,User-Agent Key:Server:Apache/2.4.12 Key:Connection:Keep-Alive Key:Last-Modified:Sat,Jun 2015 23:03:46 GMT Key:Content-Type:Audio/MPEG Key:Accept-Ranges:bytes Key:Date:Tue,Tue,Jun 2016 17:59:21 GMT Key:Content-Encoding:gzip

使用curl(在macbook上)我得到:

curl-i http://boulderhomegrown.com/fiddletunes/qualiosemridge-100.mp3

HTTP/1.1 200 OK日期:Tue,12 Apr 2016 14:55:17 GMT服务器:Apache/2.4.12上次修改:Sat,13 Jun 2015 23:03:46 GMT etag:“2EC0BC0-1A172E-5186E3CA6B55F”接受-范围:字节内容-长度:1709870变化:接受-编码,用户-代理内容-类型:音频/MPEG

注意内容长度!!当然,两者的url都是相同的。它是我的Objective-C中的一个实例变量。

共有1个答案

蓬化
2023-03-14

默认情况下,您发送的请求具有header-accept-encoding:gzip,deflate,服务器apache在本例中不添加headercontent-length(默认情况下对于较大的文件)。因此,如果您用value:identity替换该头。它将提供文件的正确大小。

代码如下:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myURL];
request.HTTPMethod = @"HEAD";
[request addValue:@"identity" forHTTPHeaderField:@"Accept-Encoding"];

只需添加字段,您就会在响应中得到正确的头,就像curl-i所做的那样。

 类似资料:
  • 我似乎得到了错误的哈希值通过我的webSocket键。据我所知,套接字的客户端工作,因为当我让它连接到其他服务器时,它是成功的。 指数js 指数html 运行时密钥和哈希对的示例如下: PxsrStN1CGLK/JBYydUFjg== QAK TE6u sV705GI LpP4yKM04Y= 顶部是浏览器给出的键,底部是getAVal函数返回的值,它是不正确的,导致此消息。 WebSocket握手

  • 如何使用.NET将Content-Length,Content-Type和Last-Modified添加到HttpResponseMessage标头。 我需要手动将所有这些值添加到响应中,添加这些字段后,我需要从服务器返回响应。我试着以空闲的方式添加这些字段 我得到了休耕的错误 “错误使用了标头名称。请确保请求标头与HttpRequestMessage一起使用,响应标头与HttpReponseMe

  • 问题内容: 我有一个网页,其中包含过滤文本框和列表框。修改文本框将触发AJAX请求,该请求将返回一个值数组,用于填充列表框。 这些调用有时会失败,这取决于返回的数据大小。返回的小尺寸数据将导致错误,大尺寸的数据已成功返回并进行了处理。 仅当我使用大于4.2的jQuery版本时,才会发生此问题。如果我使用jQuery 4.2,则不会有问题。 这是调用的代码: 如果返回两个元素,这是调试控制台的内容:

  • 问题内容: 我的JavaScript应用程序需要确定资源的长度, 然后 才能使用Ajax下载资源。通常这不是问题,您只需发出HEAD请求并提取即可。 但是,资源存储在与客户端不同的服务器上。(我控制的服务器)。因此,我正在使用CORS发出跨域Ajax请求,并已设置服务器以使用自定义标头响应HEAD请求和GET / POST请求的预检请求。 总的来说,这很有效,但是在使用CORS时,我似乎找不到一种

  • 问题内容: 我正在使用Android中包含的Apache HttpClient(4.1)执行HttpPut。我已经验证我只有1个content- length标题。但是,每次发送请求时,都会收到有关已指定的Content-Length标头的协议异常。 引起原因:org.apache.http.ProtocolException:Content- Length标头已存在于org.apache.htt

  • 问题内容: 早上, 我需要从Web服务返回一条消息。以下是我的代码示例,我正在返回一个字符串。 我目前收到以下回应… 我理想上想返回类似 我敢肯定,一旦我有了主意,就可以在需要时退还其他物品。这只是我需要解决的基础。 非常感谢所有帮助,在此先感谢:) 更新:刚发现这个… 我需要类似的东西吗 问题答案: 用: 返回的结果将类似于: