【问题标题】:Get HTTP header fields only on iPhone仅在 iPhone 上获取 HTTP 标头字段
【发布时间】:2011-02-03 15:24:28
【问题描述】:

我只想获取 URL 请求的标头。到目前为止,我一直在使用 stringWithContentsOfURL() 进行所有下载,但现在我只对标题感兴趣,并且下载整个文件不可行,因为它太大了。

我找到了显示如何在收到响应后读取标头的解决方案,但是如何在请求中指定我只希望下载标头。跳过身体!

谢谢。

【问题讨论】:

    标签: iphone http url header


    【解决方案1】:

    向相关 URL 异步发送 HEAD 请求,然后访问 HTTPURLResponse / NSHTTPURLResponse 上的 allHeaderFields 属性。

    斯威夫特 4

    var request = URLRequest(url: URL(string: "https://google.com/")!)
    request.httpMethod = "HEAD"
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let response = response as? HTTPURLResponse,
            let headers = response.allHeaderFields as? [String: String] else {
            return
        }
    }
    task.resume()
    

    目标-C

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
    [request setHTTPMethod:@"HEAD"];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                               NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields];
                           }];
    

    【讨论】:

    • 比@FKDev 的答案更受欢迎,因为这个建议使用异步API - 并且确实使用NSMutableURLRequest 正确。 ;)
    【解决方案2】:

    我用过的。下面的代码是同步的,但您可以使用委托使其异步。

        NSMutableURLRequest *newRequest = ... //init your request...
        NSURLResponse *response=nil;
        NSError *error=nil;
    
        [newRequest setValue:@"HEAD" forKey:@"HTTPMethod"];
        [NSURLConnection sendSynchronousRequest:newRequest returningResponse:&response error:&error];
        [newRequest release];
        //Get MIME type from the response
        NSString* MIMEType = [response MIMEType];
    

    编辑添加了用 NSMutableRequest 替换 NSURLRequest。

    【讨论】:

    • 你必须使用 NSMutableURLRequest 而不是 NSURLRequest 然后调用 setHTTPMethod:@"HEAD"。我没有确认这是否有效。它应该..
    • 不要吹毛求疵。但是,在上面的答案中用“[[NSMutableURLRequest alloc] initWithURL:...”替换“...”是可行的。所以,从技术上讲,答案没有错。恶意总是赢;) 至于同步/异步辩论,它是题外话。丹是对的。
    • 嗯,你是对的......我会收回我的反对票,但是我需要编辑答案才能做到这一点。 =)
    【解决方案3】:

    只实现 didReceiveResponse 委托方法

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        NSInteger statusCode = [(NSHTTPURLResponse*)response statusCode];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      相关资源
      最近更新 更多