如何获取HTTP标头

时间:2012-11-05 16:33:39

标签: objective-c http uiwebview uiwebviewdelegate

如何从Objective-C中的NSURLRequest检索所有HTTP标头?

5 个答案:

答案 0 :(得分:36)

这属于容易但不明显的iPhone编程问题。值得一个快速的帖子:

HTTP连接的标头包含在NSHTTPURLResponse类中。如果您有NSHTTPURLResponse变量,则可以通过发送allHeaderFields消息轻松地将标题作为NSDictionary输出。

对于同步请求 - 不推荐,因为它们会阻止 - 很容易填充NSHTTPURLResponse

NSURL *url = [NSURL URLWithString:@"http://www.mobileorchard.com"];
NSURLRequest *request = [NSURLRequest requestWithURL: url];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest: request returningResponse: &response error: nil];
if ([response respondsToSelector:@selector(allHeaderFields)]) {
NSDictionary *dictionary = [response allHeaderFields];
NSLog([dictionary description]);
}

使用异步请求,您需要做更多的工作。调用回调connection:didReceiveResponse:时,会传递NSURLResponse作为第二个参数。您可以将其转换为NSHTTPURLResponse,如此:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;    
if ([response respondsToSelector:@selector(allHeaderFields)]) {
    NSDictionary *dictionary = [httpResponse allHeaderFields];
    NSLog([dictionary description]);
}
}

答案 1 :(得分:4)

鉴于iOS 9已弃用no module named gender_univ,您可以使用NSURLConnectionNSURLSessionNSURL获取MIME类型信息。

您要求会话检索URL,然后在委托回调中收到第一个NSURLRequest(包含MIME类型信息)后取消会话以防止它下载整个URL。

这是一些简单的Swift代码:

NSURLResponse

我在github的URLEnquiry项目中打包了类似的功能,这使得对MIME类型和HTTP头进行内联查询变得更容易一些。 URLEnquiry.swift是可以放入您自己的项目中的感兴趣的文件。

答案 2 :(得分:2)

YourViewController.h

@interface YourViewController : UIViewController <UIWebViewDelegate>
    @property (weak, nonatomic) IBOutlet UIWebView *yourWebView;
@end

YourViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    //Set the UIWebView delegate to your view controller
    self.yourWebView.delegate = self;

    //Request your URL
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://website.com/your-page.php"]];

    [self.legalWebView loadRequest:request];
}

//Implement the following method
- (void)webViewDidFinishLoad:(UIWebView *)webView{
    NSLog(@"%@",[webView.request allHTTPHeaderFields]);
}

答案 3 :(得分:2)

使用Alamofire提高效率的Swift版本。这对我有用:

Alamofire.request(YOUR_URL).responseJSON {(data) in

if let val = data.response?.allHeaderFields as? [String: Any] {
      print("\(val)")
    }
}

答案 4 :(得分:0)

您可以使用AFHTTPSessionManager框架并在请求之后或在下面的示例中获取标头(以获取所有键):

NSHTTPURLResponse *响应=(NSHTTPURLResponse *)task.response; NSLog(@“%@”,[reponseHeaders allHeaderFields]);

要访问特定密钥:[reponseHeaders allHeaderFields] [@“ someKey”]

请参阅: https://github.com/AFNetworking/AFNetworking/issues/3688