概要
Android(Kotlin) の HTTP ネットワークライブラリである fuel を使って API リクエストする際、 cookie を初期化してリクエストする方法です。
(タイトルに HttpURLConnection とあるのは fuel 内でリクエストする際 HttpURLConnection を使っているため)
- なぜ初期化したいのか
- 複数のアカウントでログインできる機能を実装していた
- 1つ目のアカウントでログインするとログインしたアカウントの cookie が保持されてしまい、2つ目のアカウントでログインしようとすると既に「ログイン済み」という扱いをされていた
- 2つ目のアカウントでログインするときには「未ログイン」状態にする必要があった
方法
CookieHandler.setDefault(CookieManager())
こちらのコードで cookie が初期化されるので、リクエストする前に実行させればよいです。
なぜこの方法で初期化できるのか
わかってしまえばなんてことはないのですが、この答えにたどり着くまでに調べたことをつらつらと。
-
fuel が API リクエストするときに使ってるのは HttpURLConnection
-
HttpURLConnection は java.net.CookieManager を参照する
-
java.net.CookieManager は java.net.CookieHandler を継承しており、以下の構成になっている(java.net.CookieManager のソースコメントに書いてあったやつをそのまま引用してます)
* use
* CookieHandler <------- HttpURLConnection
* ^
* | impl
* | use
* CookieManager -------> CookiePolicy
* | use
* |--------> HttpCookie
* | ^
* | | use
* | use |
* |--------> CookieStore
* ^
* | impl
* |
* Internal in-memory implementation
- いちおう fuel の Request から HttpURLConnection を出力して CookieHandler を確認
- はじめてリクエストするとき


- よって以下のコードでリクエストする前に java.net.CookieHandler を初期化すればよい
CookieHandler.setDefault(CookieManager())
注意
- Cookie を引き継いだ状態で API リクエストしたい場合は、初期化する前に今の状態をどこかに(Preferencesあたりかな)へ退避させたりする必要があります。