一覧画面で設定画面で設定した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" }
:
追記後、『Sync Now』で内容をプロジェクトに反映させます。
:core:dataモジュールのbuild.gradle.ktsにOkHttpモジュールへの参照を追記します。
:
dependencies {
:
implementation(libs.okhttp)
}
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
リポジトリ層にOkHttpのインターフェースを作成します。
ファイル名をOkHttpHtmlRepository.ktにしています。
package jp.co.example.android01.core.data.repository
interface OkHttpHtmlRepository {
suspend fun getHtmlContent(url: String): Result<String>
}
インターフェースの実装クラスを作成します。
ファイル名を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)
}
}
}
リポジトリを追加したので、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()
}
: