2012-11-05 56 views

答えて

32

これは、iPhoneプログラミングの問題の簡単ですが、明白ではないクラスに該当します。クイック投稿に値する:

NSHTTPURLResponseクラスには、HTTP接続のヘッダーが含まれています。 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:が呼び出されると、第2パラメータとしてNSURLResponseが渡されます。あなたはそのようなNSHTTPURLResponseにキャストすることができます:NSURLConnection考える

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

http応答ヘッダーを取得してからHEAD要求を送信したい場合は、 HEAD要求は応答の本体をフェッチしません。 例 - リクエストでHttpメソッドの型を設定します。 NSMutableURLRequest * mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url]; mutableRequest.HTTPMethod = @ "HEAD"; – Omkar

+0

NSURLResponseをNSHTTPURLResponseにキャストすべき理由は? – youssman

+0

これはリクエストで送信されたすべてのヘッダを記録しません!追加のヘッダーをNSURLSessionConfigurationに設定すると、それらは記録されません。私はまだ応答からそれらを取得する方法を発見していない... – 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

がiOSの9から廃止されて、あなたはNSURLまたはNSURLRequestからMIMEタイプの情報を取得するためにNSURLSessionを使用することができます。

URLを取得するようにセッションに依頼し、デリゲートコールバックに最初のNSURLResponse(MIMEタイプ情報を含む)を受信すると、セッションをキャンセルしてURL全体をダウンロードしないようにします。ここで

はそれをしないいくつかの裸の骨スウィフトコードです:

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

私はそれが少し楽MIMEタイプのためのインラインクエリを作成することができますgithubのでURLEnquiryプロジェクトで同様の機能をパッケージ化しましたし、 HTTPヘッダー。 URLEnquiry.swiftは、自分のプロジェクトにドロップする対象のファイルです。

1

Alamofireを効率的に使用するスイフトバージョン。これは私のために働いたものです:

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

if let val = data.response?.allHeaderFields as? [String: Any] { 
     print("\(val)") 
    } 
} 
関連する問題