2012-11-05 17 views

Antwort

32

Dies fällt unter die einfach, aber nicht offensichtlich Klasse von iPhone-Programmierung Probleme. Würdig für einen schnellen Beitrag:

Die Header für eine HTTP-Verbindung sind in der NSHTTPURLResponse Klasse enthalten. Wenn Sie eine NSHTTPURLResponse Variable haben, können Sie die Header einfach als NSDictionary abrufen, indem Sie die Nachricht allHeaderFields senden.

Für synchrone Anforderungen - nicht zu empfehlen, weil sie blockieren - es ist einfach ein NSHTTPURLResponse zu füllen:

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

Mit einer asynchronen Anfrage Sie ein wenig mehr Arbeit zu tun haben. Wenn der Rückruf connection:didReceiveResponse: aufgerufen wird, wird ein NSURLResponse als zweiter Parameter übergeben. Sie können es zu einem NSHTTPURLResponse gegossen wie so:

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

Wenn Sie nur HTTP-Antwort-Header abrufen möchten, dann post HEAD-Anfrage. Die HEAD-Anforderung ruft den Antwortkörper nicht ab. Beispiel - Set Http Method Typ in Anfrage. NSMutableURLRequest * mutableRequest = [[NSMutableURLRequest-Zuweisung] initWithURL: url]; mutableRequest.HTTPMethod = @ "HEAD"; – Omkar

+0

Warum sollten wir NSURLResponse in eine NSHTTPURLResponse umwandeln? – youssman

+0

Dies protokolliert * nicht * alle in der Anfrage gesendeten Header! Wenn Sie der NSURLSessionConfiguration zusätzliche Header hinzufügen, werden diese nicht protokolliert. Ich habe noch nicht gefunden, wie man sie von der Antwort abruft ... – Johanneke

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]); 
} 
2

Da NSURLConnection von iOS 9 veraltet ist, können Sie eine NSURLSession verwenden, um MIME-Typ Informationen von einem NSURL oder NSURLRequest zu bekommen.

Sie bitten, die Sitzung die URL abzurufen, dann auf den ersten NSURLResponse Empfang (die MIME-Typ-Information enthält) in einem Delegierten Rückruf Sie die Sitzung abzubrechen, es zu verhindern, dass die ganze URL herunterzuladen.

Hier einige nackten Knochen Swift-Code, der es tut:

/// 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() 
} 

ich eine ähnliche Funktionalität im URLEnquiry Projekt bei Github verpackt haben, die es ein bisschen einfacher macht in-line-Abfragen für MIME-Typen zu machen und HTTP-Header URLEnquiry.swift ist die Datei von Interesse, die in Ihr eigenes Projekt eingefügt werden könnte.

1

Schnelle Version mit Alamofire für Effizienz. Dies ist, was für mich funktionierte:

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

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