【Kotlin/Android】OkHttpの使い方!HTTP通信でAPIを取得

この記事からわかること
- Android Studio/KotlinでOkHttpの使い方
- HTTP通信を実装してAPIを取得する方法
- QiitaAPIを使用した記事取得アプリの実装方法
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
OkHttpとは?
OkHttpはAndroidアプリ開発で使用できるHTTPクライアントライブラリです。HTTP/2およびSPDYをサポートしており、複数のリクエストやレスポンスを同時に処理することができたり、ネットワークが不安定な際の自動的なリトライ処理、キャッシュ機能など様々や機能が提供されています。
開発したのはSquare社という会社でオープンソースのライブラリになっています。Square社が開発したライブラリには同じような役割の「Retrofit」があります。こちらは内部的にOKHttpを使用しており、「Retrofit」ではOkHttpよりJSONのシリアライズ/デシリアライズに長けており、RESTful APIでの通信に活用できます。
OkHttpでAPIを叩く実装の流れ
- OkHttpの導入
- インターネットの利用を可能にする
- HTTP通信を実装する
今回はテストとしてQiitaのAPIを使用してみます。
記事(新着順20個):https://qiita.com/api/v2/items
1.OkHttpの導入
OkHttpをAndroid Studioで使用するために「bundle.gradle(Module)」に以下の文を追加して「Sync Now」をクリックします。
2.インターネットの利用を可能にする
AndroidアプリからWeb通信をさせるためにはマニフェストファイルへで適切なパーミッションを定義する必要があります。デフォルトではインターネットアクセスが許可されていないので「AndroidManifest.xml」に<uses-permission android:name="android.permission.INTERNET" />
を追加しておきます。
3.HTTP通信を実装する
OkHttp
でHTTP通信を実装するためにはOkHttpClient
インスタンスを作成します。このクラスがGETやPOSTなどのHTTPリクエストを送信する役割を持っています。
次にRequest
型のリクエストを作成します。url
メソッドの引数にAPIで実行したいエンドポイントを指定します。何も指定しなければGETリクエストになります。
実行するにはnewCall(request)
メソッドに引数にリクエストを渡し、execute
メソッドを使用します。execute
はHTTPリクエストを同期的に実行し、レスポンスを返します。response.isSuccessful
でHTTPステータスが200番台(成功)であるかどうか識別でき、headers
でヘッダー情報をbody
でレスポンスの中身を取得できます。
またHTTPリクエストはメインスレッド以外で実行しないとandroid.os.NetworkOnMainThreadException
を吐きます。
実装例
useメソッドでリソース管理をスマートに
Response
はCloseable
を継承しているので使用後は明示的にclose
メソッドでリソースを閉じる必要があります。Closeable
なのでuse
メソッドを使用することで明示的にリソースを解放処理を実装しなくても済むのでスッキリした記述にすることができます。
enqueue:非同期的に実行する
enqueue
メソッドはHTTPリクエストを非同期的に実行します。引数にはCallback
型で結果を処理するコールバックを指定します。
cache:キャッシュを有効にする
OkHttpではHTTPリクエストのレスポンスをキャッシュする仕組みが用意されています。キャッシュの保存先と最大保存容量を指定してCache
インスタンスを生成しcache
メソッドでOkHttpClient
に渡します。
キャッシュがある場合は基本的にキャッシュされているデータを返すようになるので通信コストを抑えることが可能になります。
レスポンスがキャッシュかどうか識別
Response
のcacheResponse
でレスポンスがキャッシュかネットワークか識別することが可能です。
CacheControl:キャッシュを明示的に使用しない
キャッシュはCacheControl
を使用してキャッシュの使用の有無を変更できます。noCache
を指定するとキャッシュを使わず、常にサーバーから取得するようにできます。
- noCache:キャッシュを使わず、常にサーバーから取得する
- noStore:キャッシュを完全に無効にし、キャッシュに保存されないようにする
- maxAge(int, TimeUnit):キャッシュが有効である最大時間を設定
- onlyIfCached:キャッシュがある場合のみレスポンスを返す
キャッシュを削除
キャッシュを削除したい場合は保存先のキャッシュディレクトリを削除します。
タイムアウト処理
タイムアウト処理を設けたい場合はOkHttpClient
からそれぞれ呼び出して設定します。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。