web-dev-qa-db-ja.com

Alamofire:HTTPリダイレクトに従う(または従わない)

リクエストごとにリダイレクトに従うように(または従わないように)Alamofireを構成しようとしています。

Alamofireには、現在のURLセッションのSessionDelegateとして機能するプライベート内部クラスNSURLSessionTaskDelegateがあります。 SessionDelegateは、関連するデリゲートメソッドURLSession(session:, task:, willPerformHTTPRedirection response:, request:, completionHandler:)を実装します。これは、まさに私が望むものです。

さらに良いことに、デリゲートの実装は、taskWillPerformHTTPRedirectionという名前のカスタム変数クロージャを参照して、リダイレクトの処理方法を決定します。これも、まさに私が望むものです。

そして、私が知る限り、クロージャはデフォルトで常にnilであり、Alamofireによって内部的に割り当てられていません。これは、ユーザーがクロージャを割り当てることを目的としていることを示しています。

問題:このプライベートSessionDelegateクラスにアクセスして、そのtaskWillPerformHTTPRedirection変数にクロージャを割り当てることができません。これはプライベートクラスであり、私のSwiftファイルには表示されません。リダイレクトに従う(従わない)ようにAlamofireリクエストを構成する適切な方法は何ですか?

26
Jonathan Hersh

別のプルリクエスト のおかげで、柔軟なリダイレクト処理がAlamofireに追加され、Alamofire 1.2.0で使用できるようになりました。

10
Jonathan Hersh

このように使えます

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let sessionDelegate = Manager.SessionDelegate()
sessionDelegate.taskWillPerformHTTPRedirectionWithCompletion = {
   (session: NSURLSession, task: NSURLSessionTask, response: NSHTTPURLResponse,
    newRequest: NSURLRequest, completionHandler: NSURLRequest? -> Void) in

    // do something
}

let manager = Manager(configuration: configuration, delegate: sessionDelegate)

Alamofire Managerは、delegateを同じくらい強力に保つので、確実に

public let delegate: SessionDelegate

ただし、覚えておいてください willPerformHTTPRedirection

このメソッドは、デフォルトセッションとエフェメラルセッションのタスクに対してのみ呼び出されます。バックグラウンドセッションのタスクは、自動的にリダイレクトに従います。

ファンダメンタルズについても読むのが良い リダイレクトやその他のリクエストの変更の処理

7
onmyway133

この問題はずっと前に議論されたと思います、これをチェックしてください問題

マットの答えは明らかでした:

SessionDelegate、TaskDelegate、DataTaskDelegate、およびDownloadTaskDelegateのさまざまなクロージャー型のプロパティは、特定のデリゲートの動作を拡張/オーバーライドするためにクライアントが使用することを目的としていると思います。


実際、それは正しくありません。これらは、完全を期すために内部で実装されています。エンドユーザー向けの機能は、ManagerまたはRequestで公開されます。 。

とにかく、私はバウンティがアーロンによって提供されているのを見ますが、ジョナサンは彼自身をフォークしましたバージョン

0
ProllyGeek