仅在iPhone上获取HTTP头字段

5
我想要获取一个URL请求的头部信息。到目前为止,我一直使用stringWithContentsOfURL()进行下载,但现在我只对头部感兴趣,而且由于文件太大,下载整个文件是不可行的。
我已经找到了一些解决方案,可以在响应接收后显示如何读取头部信息,但是我该如何在请求中指定仅下载头部信息?跳过正文!
谢谢。
3个回答

11

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

Swift 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()

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

1
这个方案比@FKDev的更好,因为它建议使用异步API,并且正确使用了NSMutableURLRequest。;) - CouchDeveloper

2

仅实现didReceiveResponse代理方法

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

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

编辑以更换NSURLRequest为NSMutableRequest。


3
你需要使用NSMutableURLRequest而不是NSURLRequest,然后调用setHTTPMethod:@"HEAD"。我没有确认这是否有效。它应该有效。 - amit
不是挑刺的人,但是在上面的答案中用“[[NSMutableURLRequest alloc] initWithURL:…”替换“...”是可以的。因此,技术上说,答案是正确的。恶意总是会获胜;) 至于同步/异步辩论,这是离题了。Dan是正确的。 - FKDev
嗯,你说得对...我会撤回我的踩,但似乎需要编辑答案才能这样做。=) - jake_hetfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接