Skip to content

通信周りでRetrofit+Gsonを利用する #5

Description

@and-matsuura

あなたの改善要求はどんな問題に関連していますか?
通信ライブラリ+converterを利用することで簡単に通信処理を書いてみましょう

解決目的
Retrofitを利用することで非同期処理周りが見やすくかつ簡単に実装が可能になります。
業務で使うことも多いと思うので、対応した場合どんな感じになるか確認してみましょう

検討した代替案

  • Retofit
    通信リクエストの組み立てや処理のハンドリングが容易に行えるようになります
  • Gson
    レスポンスの型に相当するDataClassを定義しておくことでResponseをそのクラスに直接変換ができます

build.gradle

    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

ReposRemoteDataSource.kt

    fun requestByRetrofit(callback: ReposDataSource.LoadReposCallback) {
        val retrofit =
            Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create())  // <- 変換処理実行設定はここだけ。通信の基本URLもここで設定
                .build()

        val client = retrofit.create(GitHubRequest::class.java)
        client.getRepository("Neos21").enqueue(object : Callback<List<RepositoryData>> {
            override fun onFailure(call: Call<List<RepositoryData>>, t: Throwable) {
                // TODO エラー時の処理
            }

            override fun onResponse(call: Call<List<RepositoryData>>, response: Response<List<RepositoryData>>) {
                val result = response.body()
                result?.let {
                    // いったんコード用のRepository型にparseします
                    // Repository(var title:String, var url: String?, var readmeURL: String)
                    callback.onReposLoaded(it.map { repository ->
                        Repository(repository.name, repository.html_url, repository.getReadMeUrl())
                    })
                }
            }
        })
    }

    // レスポンスデータを格納するクラス
    data class RepositoryData(
        val name: String,
        val html_url: String,
        val id: String,
        val description: String
    ) {
        fun getReadMeUrl() = "$html_url/blob/master/README.md"
    }

    interface GitHubRequest {
        @GET("users/{user_name}/repos")  // <- 通信先のEndpointの設定。URLパラメータも引数から与えられる
        fun getRepository(@Path("user_name") userName: String): Call<List<RepositoryData>>
    }

補足
モバイルアプリ開発では様々なライブラリが提供されているので、それらを利用することで効率的な開発ができます😀

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions