objective c - superponer - Cómo obtener encabezados HTTP
superponer graficas en r (4)
¿Cómo recupera todos los encabezados HTTP de una NSURLRequest
en Objective-C?
Dado que NSURLConnection
está en desuso de iOS 9, puede usar una NSURLSession
para obtener información de tipo MIME de un NSURL
o NSURLRequest
.
Solicita a la sesión que recupere la URL, luego de recibir la primera NSURLResponse
(que contiene información de tipo MIME) en una devolución de llamada de delegado, cancela la sesión para evitar que descargue la URL completa.
Aquí hay algunos códigos Swift que lo hacen:
/// Use an NSURLSession to request MIME type and HTTP header details from URL.
///
/// Results extracted in delegate callback function URLSession(session:task:didCompleteWithError:).
///
func requestMIMETypeAndHeaderTypeDetails() {
let url = NSURL.init(string: "https://google.com/")
let urlRequest = NSURLRequest.init(URL: url!)
let session = NSURLSession.init(configuration: NSURLSessionConfiguration.ephemeralSessionConfiguration(), delegate: self, delegateQueue: NSOperationQueue.mainQueue())
let dataTask = session.dataTaskWithRequest(urlRequest)
dataTask.resume()
}
//MARK: NSURLSessionDelegate methods
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
// Cancel the rest of the download - we only want the initial response to give us MIME type and header info.
completionHandler(NSURLSessionResponseDisposition.Cancel)
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?)
{
var mimeType: String? = nil
var headers: [NSObject : AnyObject]? = nil
// Ignore NSURLErrorCancelled errors - these are a result of us cancelling the session in
// the delegate method URLSession(session:dataTask:response:completionHandler:).
if (error == nil || error?.code == NSURLErrorCancelled) {
mimeType = task.response?.MIMEType
if let httpStatusCode = (task.response as? NSHTTPURLResponse)?.statusCode {
headers = (task.response as? NSHTTPURLResponse)?.allHeaderFields
if httpStatusCode >= 200 && httpStatusCode < 300 {
// All good
} else {
// You may want to invalidate the mimeType/headers here as an http error
// occurred so the mimeType may actually be for a 404 page or
// other resource, rather than the URL you originally requested!
// mimeType = nil
// headers = nil
}
}
}
NSLog("mimeType = /(mimeType)")
NSLog("headers = /(headers)")
session.invalidateAndCancel()
}
He empaquetado una funcionalidad similar en el proyecto URLEnquiry en github, lo que hace que sea un poco más fácil hacer consultas en línea para tipos MIME y encabezados HTTP. URLEnquiry.swift es el archivo de interés que podría incluirse en su propio proyecto.
Esto cae bajo la clase fácil, pero no obvia de problemas de programación de iPhone. Digno de un post rápido:
Los encabezados de una conexión HTTP se incluyen en la clase NSHTTPURLResponse
. Si tiene una variable NSHTTPURLResponse
, puede obtener fácilmente los encabezados como NSDictionary
enviando el mensaje allHeaderFields.
Para las solicitudes sincrónicas, no se recomienda porque bloquean, es fácil llenar un 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]);
}
Con una solicitud asíncrona tienes que hacer un poco más de trabajo. Cuando se llama a la connection:didReceiveResponse:
devolución de llamada connection:didReceiveResponse:
se pasa un NSURLResponse
como el segundo parámetro. Puedes NSHTTPURLResponse
a un NSHTTPURLResponse
así:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
if ([response respondsToSelector:@selector(allHeaderFields)]) {
NSDictionary *dictionary = [httpResponse allHeaderFields];
NSLog([dictionary description]);
}
}
Versión Swift utilizando Alamofire para mayor eficiencia. Esto es lo que funcionó para mí:
Alamofire.request(YOUR_URL).responseJSON {(data) in
if let val = data.response?.allHeaderFields as? [String: Any] {
print("/(val)")
}
}
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]);
}