Android で DefaultHttpClient
が deprecated になって久しく、デフォルトだと HttpURLConnection
を使うことになりました。
HttpURLConnection
は http と https 間のリダイレクトを行わないというポリシーがあるらしく、リダイレクトした場合処理を行いません。
特にリダイレクトを有効にするオプションもないので、HttpURLConnection
を使う場合は自分でリダイレクトのチェック処理を書く必要があります。
今開発しているアプリ( PhotoLinkViewer )でリダイレクトの結果をチェックしているのですが、http -> https -> http
とリダイレクトするサイトがあったりして処理が結構めんどくさい。
ということで OkHttp という Square,Inc が作っているオープンソースのネットワークライブラリを用いることにしました。
まずは build.gradle
に
compile 'com.squareup.okhttp:okhttp:{入れるバージョン}'
を書いて導入します。
そして
new OkHttpClient().newCall(new Request.Builder().url(url).build()).enqueue(com.squareup.okhttp.Callback callback);
- kotlin
OkHttpClient().newCall(Request.Builder().url(url).build()).enqueue(callback: com.squareup.okhttp.Callback)
のようにしてよしなに callback を設定すると http <-> https にリダイレクトしていてもリダイレクト後の結果を取得できます。AsyncTask
上とかなら .enqueue()
しなくても .execute()
すれば直接 Response
を取得できます。
たとえば、リダイレクト先の URL のみを取得したい場合
- kotlin
OkHttpClient().newCall(Request.Builder().url(url).head().build()).enqueue(object : Callback{ override fun onResponse(response: com.squareup.okhttp.Response) { val url = response.request().urlString() } override fun onFailure(request: Request, e: IOException) { e.printStackTrace() } })
のようにして取得することができました。