Unyablog.

のにれんのブログ

Android で http / https 間のリダイレクト結果を OkHttp で取得する

AndroidDefaultHttpClient が 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()
                }
            })

のようにして取得することができました。