Genta Hirauchi

公開日:2020/06/10
更新日:2020/08/03

【Kotlin】HttpURLConnectionでRangeリクエストをする方法

  • HttpURLConnectionで任意の場所のデータを取得したい。
  • 中断されたダウンロードを再開させる処理が実装したい。

HTTP通信で特定の範囲のデータを取得したり、中断されたダウンロードを、任意の場所から再開するなどの処理は、Rangeリクエストが必要となります。

本記事では、HttpURLConnectionクラスを使用したRangeリクエストの方法を解説致します。

目次

HttpURLConnectionについて

HttpURLConnectionは、サーバーとHTTP通信をするための機能を提供するクラスです。

参考:HttpURLConnection | Android Developers

HttpURLConnectionの基本的な使い方につきましては、以下記事をご覧ください。

【Kotlin】HttpURLConnectionで、HTTP通信を行う方法を解説

サーバー上のファイルをダウンロードは、HttpURLConnectionによるHTTP通信処理を実装することで実現することができます。 本記事では、Macのローカル環境にサーバーを立ち上げる方法と、HTTP通信処理の実装、そして、HTTP通信処理を実装する上で発生しうる問題の解決方法について紹介致します。

また、HTTP通信の動作確認には、サーバーが必要となります。ローカルにサーバーを立ち上げる方法につきましては、以下記事をご覧ください。

【Kotlin】MacのlocalhostにAndroid端末から接続する方法を解説

サーバーとの通信処理を実装する際、実際に使用されているサーバーを使用してするのではなく、まずはローカル環境にサーバーを構築して実装を進めると思います。本記事では、Macのローカル環境にサーバーを立ち上げる方法と、Androidの実機、およびEmulatorから、localhostにアクセスする方法について解説致します。

Rangeリクエストの実装

HttpURLCoonnectionでRangeリクエストをするには、setRequestProperty(String key, String value)関数を使用します。

第1引数にはリクエストのキーを、第2引数には値を指定します。Rangeリクエストの場合、keyには”Range”、valueには”bytes=0-10”というように、リクエストする範囲を指定します。

では、実装例です。

10行目のhttpURLConnection.setRequestProperty(“Range”, “bytes=25-40”)という部分でRangeリクエストの設定をしています。

今回のサンプルでは、”bytes=25-40″と指定しておりますので、25番目から40番目までの、26byteのデータの取得を行います。もし、「40番目から最後まで」としたい場合は、”bytes=40-“と指定します。

Rangeリクエストの実装で注意していただきたいのが、httpURLConnection.responseCodeです。通常のHTTPリクエストでは、connectがうまくいくと、HttpURLConnection.HTTP_OK(200)が返ってきます。

しかし、Rangeリクエストの場合は、HttpURLConnection.HTTP_PARTIAL(206)がresponseCodeが返ってきます。HTTP_OKではないですが、エラーではないということを覚えておきましょう。