Wie erhalten Sie alle HTTP-Header von einem NSURLRequest
in Objective-C?So erhalten Sie HTTP-Header
Antwort
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]);
}
}
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]);
}
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.
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)")
}
}
- 1. So senden Sie HTTPHeader mit QT WebEngine?
- 2. Guice inject httpheader
- 3. So erhalten Sie Elternkomponentenattribute
- 4. So erhalten Sie Testverlauf
- 5. So erhalten Sie den Ländernamen
- 6. So erhalten Sie order_item_id WooCommerce
- 7. So erhalten Sie die Standardshell
- 8. So erhalten Sie HttpRequestMessage-Daten
- 9. So erhalten Sie die Stringlänge
- 10. So erhalten Sie das Eingabefeld
- 11. WinApi - So erhalten Sie SHELLDLL_DefView
- 12. So erhalten Sie eine Umleitungsantwort
- 13. So erhalten Sie die Kompassrichtung
- 14. So erhalten Sie Image Resource
- 15. So erhalten Sie das Konfigurationselement
- 16. So erhalten Sie eine Direktive:
- 17. So erhalten Sie Android-Systemfarben
- 18. So erhalten Sie die Schriftgröße von CMFCPropertyFontProperty
- 19. PyQt: So erhalten Sie die meisten QListWidget
- 20. So erhalten Sie Windows 8 Live ID
- 21. So erhalten Sie Sitzungsdaten über eine Benutzerregistrierung
- 22. Sharepoint 2010: So erhalten Sie SPList-Objekte?
- 23. So erhalten Sie die PIDL eines IShellFolder
- 24. So erhalten Sie vordefinierte Papiergröße von PaperKind
- 25. So erhalten Sie Datensätze aus der Listenansicht
- 26. So erhalten Sie Daten von Parse.com Datenbank
- 27. So erhalten Sie alle Dialognachrichten in QuickBlox
- 28. So erhalten Sie, welches Fragment ausgewählt wurde
- 29. So erhalten Sie den Dropdown-Listenindex
- 30. So erhalten Sie widersprüchliche Zeilen mit JGit
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
Warum sollten wir NSURLResponse in eine NSHTTPURLResponse umwandeln? – youssman
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