web-dev-qa-db-ja.com

HTTPヘッダーを取得する方法

Objective-CのNSURLRequestからすべてのHTTPヘッダーを取得するにはどうすればよいですか?

28
Nagra

これは簡単ですが、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:が呼び出され、2番目のパラメーターとして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]);
}
}
37
Harish Saran

NSURLConnectionがiOS 9で廃止されている場合、NSURLSessionを使用して、NSURLまたはNSURLRequestからMIMEタイプ情報を取得できます。

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

いくつかのベアボーンSwiftそれを行うコード:

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

Githubの RLEnquiry プロジェクトに同様の機能をパッケージ化しました。これにより、MIMEタイプとHTTPヘッダーのインラインクエリが少し簡単になります。 RLEnquiry.Swift は、自分のプロジェクトにドロップされる可能性のある対象ファイルです。

4
user2067021

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
Nagra

効率化のためにAlamofireを使用したSwiftバージョン。これは私のために働いたものです:

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

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