如何从Objective-C中的NSURLRequest
检索所有HTTP标头?
答案 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
,您可以使用NSURLConnection
从NSURLSession
或NSURL
获取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