ユーザ用ツール

サイト用ツール


サイドバー

プログレス合同会社

広告

android:studio:application:okhttp

21.OkHttpの導入

一覧画面で設定画面で設定したURLのサイトからデータを取得するため、軽量で高性能なHTTPクライアントライブラリOkHttpを導入します。

バージョンカタログファイルにOkHttpのバージョン定義を追記します。

[versions]
   :
okhttp = "5.2.1"                    # https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp

[libraries]
   :
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
   :

3行目[versions]
コメント部分のURLを参照して、最新安定バージョンを指定します。
7行目[libraries]
ライブラリモジュールとバージョンを関連付けします。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

OkHttpモジュールの参照

:core:dataモジュールのbuild.gradle.ktsOkHttpモジュールへの参照を追記します。

   :
dependencies {
   :
  implementation(libs.okhttp)
}

4行目
OkHttpモジュールを参照します。

追記後、『同期アイコン』で内容をプロジェクトに反映させます。

リポジトリ層の作成

リポジトリ層にOkHttpのインターフェースを作成します。
ファイル名をOkHttpHtmlRepository.ktにしています。

package jp.co.example.android01.core.data.repository

interface OkHttpHtmlRepository {
  suspend fun getHtmlContent(url: String): Result<String>
}

4行目
urlのHTMLを取得します。

インターフェースの実装クラスを作成します。
ファイル名をOkHttpHtmlRepositoryImpl.ktにしています。

package jp.co.example.android01.core.data.repository

import javax.inject.Singleton
import javax.inject.Inject
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import java.util.concurrent.TimeUnit
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

/**
 * OkHttpによるHTMLコンテンツ取得用のリポジトリ実装
 */
@Singleton
class OkHttpHtmlRepositoryImpl @Inject constructor(
) : OkHttpHtmlRepository {
  private val okHttpClient = OkHttpClient.Builder()
    .connectTimeout(30, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .writeTimeout(30, TimeUnit.SECONDS)
    .build()

  override suspend fun getHtmlContent(url: String): Result<String> = withContext(Dispatchers.IO) {
    try {
      val request = Request.Builder()
        .url(url)
        .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
        .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
        .addHeader("Accept-Language", "ja,en-US;q=0.7,en;q=0.3")
        .addHeader("Accept-Encoding", "gzip, deflate")
        .addHeader("Connection", "keep-alive")
        .addHeader("Upgrade-Insecure-Requests", "1")
        .build()

      val response: Response = okHttpClient.newCall(request).execute()
      if (response.isSuccessful) {
        val content = response.body?.string() ?: ""
        response.close()
        Result.success(content)
      } else {
        response.close()
        Result.failure(Exception("HTTP Error: ${response.code} - ${response.message}"))
      }
    } catch (e: Exception) {
      Result.failure(e)
    }
  }
}

16行目
@Inject constructorHiltにクラスの生成方法を伝えます。

DI(Hilt)モジュールへ追記

リポジトリを追加したので、DI(Hilt)モジュールを追記します。

   :
import jp.co.example.android01.core.data.repository.OkHttpHtmlRepository
import jp.co.example.android01.core.data.repository.OkHttpHtmlRepositoryImpl
   :
object HiltModule {
   :
  @Provides
  @Singleton
  fun provideOkHttpHtmlRepository(
  ): OkHttpHtmlRepository {
    return OkHttpHtmlRepositoryImpl()
  }
   :

2行目~3行目
必要なimportを追加します。
7行目~12行目
OkHttpHtmlRepositoryの実装はOkHttpHtmlRepositoryImplであることをHiltに伝えています。

android/studio/application/okhttp.txt · 最終更新: by プログレス合同会社