Kotlin で HTTP リクエストを作成する

David Mbochi Njonge 2023年6月20日
  1. Kotlin プロジェクトを作成して依存関係を追加する
  2. Retrofit を使用して Kotlin で HTTP リクエストを作成する
  3. Java 標準ライブラリの API を使用して Kotlin で HTTP リクエストを作成する
  4. Fuel API を使用して Kotlin で HTTP リクエストを作成する
  5. OkHttp API を使用して Kotlin で HTTP リクエストを作成する
  6. まとめ
Kotlin で HTTP リクエストを作成する

HTTP は Web 用の通信プロトコルであり、Web サーバーから Web ブラウザーに Web コンテンツを提供する役割を果たします。

Web コンテンツは、静的データまたは動的データの場合があります。 静的データとは、ページに表示される情報が変化しないことを意味しますが、Web ページに表示される動的データは常に変化しています。

サーバーから取得したデータには、構造化データ、画像、動画ファイルが含まれます。 ほとんどのアプリケーションは通常、データベースによって管理される構造化データを操作します。

データベースから Web クライアントにデータを取得する際の一般的なアプローチは、安静な API を使用することです。 RESTful API は、HTTP プロトコルを介してさまざまなライブラリを使用してアプリケーションによって消費され、Web クライアントにロードされます。

このチュートリアルでは、Restful API を使用する HTTP リクエストを作成するために使用できるさまざまな方法を学習します。 Restful API は、Heroku でホストされているアプリケーションから国のリストを返します。

Kotlin プロジェクトを作成して依存関係を追加する

IntelliJ 開発環境を開き、File > New > Project を選択します。 開いたウィンドウで、プロジェクトの namekotlin-http-request として入力し、Language セクションで Kotlin を選択し、Build system セクションで Gradle を選択します。

最後に、Create ボタンを押してプロジェクトを生成します。

build.gradle.kts ファイルを開き、次のコードに示すすべての依存関係があることを確認します。 これらの依存関係は、HTTP リクエストの作成に使用できるライブラリを追加するのに役立ちます。

dependencies{
    implementation ("com.squareup.retrofit2:retrofit:2.9.0")
    implementation ("com.squareup.retrofit2:converter-gson:2.9.0")
    implementation ("com.github.kittinunf.fuel:fuel:2.3.1")
    implementation ("com.squareup.okhttp3:okhttp:4.10.0")
    testImplementation(kotlin("test"))
}

Retrofit を使用して Kotlin で HTTP リクエストを作成する

Retrofitは、Kotlin または Java でアプリケーションを開発する際に最もよく使用されるライブラリです。

kotlin フォルダーの下に、model という名前のフォルダーを作成します。 Country.kt という名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

package model

data class Country(var id: Number,
              var countryName: String);

このコードでは、サーバーから取得した オブジェクトを格納するために使用する データ クラス を作成しました。 このクラスにはフィールド idcountryName があり、サーバーから取得したオブジェクトのフィールドにマップされます。

kotlin フォルダーの下に、service という名前のフォルダーを作成します。 CountryService.kt という名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

package service

import model.Country
import retrofit2.Call
import retrofit2.http.GET

interface CountryService {
    @GET("/country/all")
    fun getAllCountries(): Call<List<Country>>;
}

このコードでは、サーバーからすべての国 List<Country> を取得するために、相対パス /country/all にマップする GET リクエストを作成しました。 サーバーからデータを取得する場合は、常に @GET アノテーションを使用します。

getAllCountries() メソッドは Call を返すことに注意してください。これは、メソッドがサーバーにリクエストを送信し、レスポンスを返すことを意味します。

CountryServiceImpl.kt という名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

package service

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class CountryServiceImpl {
    fun getCountryServiceFactory(): CountryService{
        val retrofit = Retrofit.Builder()
            .baseUrl("https://countryapp254.herokuapp.com")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

        return retrofit.create(CountryService::class.java);
    }
}

このクラスは、getAllCountries() メソッドで提供された相対 URL を、ビルダーに提供された baseUrl() にマッピングすることによって、サーバーからデータを取得するという主な作業を行います。

addConverterFactory() は、Retrofit によって提供される Gson ライブラリを使用して Kotlin オブジェクトを逆シリアル化するのに役立ちます。

kotlin フォルダーの下に Main.kt ファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

import model.Country
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import service.CountryService
import service.CountryServiceImpl

fun getAllCountriesUsingRetrofit(){
    val countryService: CountryService =
        CountryServiceImpl().getCountryServiceFactory();

    val call: Call<List<Country>> = countryService.getAllCountries();

    call.enqueue(object : Callback<List<Country>> {
        override fun onResponse(call: Call<List<Country>>,
                                response: Response<List<Country>>
        ) {
            response.body()?.forEach(::println)
        }

        override fun onFailure(call: Call<List<Country>>, t: Throwable) {
            t.printStackTrace();
        }

    })
}

fun main(){
    getAllCountriesUsingRetrofit();
}

上記のコードは、Retrofit コードが機能しているかどうかを検証します。 CountryService を返す getCountryServiceFactory() を呼び出します。

CountryService インスタンスは、getAllCountries() メソッドを呼び出すのに役立ちます。 このメソッドは、データへの応答を含む Call を返します。

サーバーから国を取得するには、enqueue() メソッドを呼び出し、CallBackonResponse() および onFailure() メソッドを実装します。

enqueue() メソッドは非同期で実行されます。コンソール アプリケーションを作成しているので、応答 body() をコンソールに記録するだけで済みます。 このコードを実行して、出力が次のようになっていることを確認します。

[{"id":18,"countryName":"Kenya"},
{"id":20,"countryName":"Tanzania"},
{"id":21,"countryName":"Ethiopia"},
{"id":22,"countryName":"Malawi"},
{"id":23,"countryName":"Country"},
{"id":24,"countryName":"Country"},
{"id":25,"countryName":"Kenya"},
{"id":26,"countryName":"Country"},
{"id":27,"countryName":"USA"},
{"id":28,"countryName":"USA"},
{"id":29,"countryName":"Kenya"},
{"id":30,"countryName":"Kenya"}]

Java 標準ライブラリの API を使用して Kotlin で HTTP リクエストを作成する

Main.kt ファイルの前の例についてコメントし、次のコードをコピーしてファイルに貼り付けます。

import java.net.HttpURLConnection
import java.net.URL

fun getCountriesUsingHttpURLConnection(){
    var url = URL("https://countryapp254.herokuapp.com/country/all");

    with(url.openConnection() as HttpURLConnection){
        inputStream.bufferedReader().use {
            it.lines().forEach(::println)
        }
    }
}

fun main(){
    getCountriesUsingHttpURLConnection();
}

URLConnection は、java.net パッケージの Java 標準ライブラリの API であり、Kotlin で HTTP リクエストを作成するために使用できます。

HttpURLConnectionURLConnection のインスタンスであり、これを使用してサーバーへの HTTP 接続を作成します。 with() 関数は、確立された接続を使用してサーバーに単一のリクエストを作成し、関数内のコードを実行して、結果を返します。

関数内の inputStreambufferedReader() を使用して確立された接続からデータを読み取り、use() 拡張関数はサーバーから読み取ったデータをコンソールに記録するのに役立ちます。 このコードを実行して、出力が次のようになっていることを確認します。

[{"id":18,"countryName":"Kenya"},
{"id":20,"countryName":"Tanzania"},
{"id":21,"countryName":"Ethiopia"},
{"id":22,"countryName":"Malawi"},
{"id":23,"countryName":"Country"},
{"id":24,"countryName":"Country"},
{"id":25,"countryName":"Kenya"},
{"id":26,"countryName":"Country"},
{"id":27,"countryName":"USA"},
{"id":28,"countryName":"USA"},
{"id":29,"countryName":"Kenya"},
{"id":30,"countryName":"Kenya"}]

Fuel API を使用して Kotlin で HTTP リクエストを作成する

Main.kt ファイルの前の例についてコメントし、次のコードをコピーしてファイルに貼り付けます。

import com.github.kittinunf.fuel.httpGet
import com.github.kittinunf.result.Result

fun getCountriesUsingFuel(){
    val request = "https://countryapp254.herokuapp.com/country/all"
        .httpGet()
        .responseString{ request, response, result ->
            when(result){
                is Result.Failure -> {
                    println(result.getException());
                }

                is Result.Success -> {
                    println(result.get())
                }
            }
        }

    request.join();
}

fun main(){
    getCountriesUsingFuel();
}

Fuel API は、アプリケーションで HTTP リクエストを作成するために使用できる別のアプローチです。 この例では、GET リクエストを行っていることを示すために、String クラスの拡張関数である httpGet() を呼び出しています。

文字列は、サーバーからデータをフェッチするために使用される RESTful API を提供します。

httpGet() メソッドは Request を返します。これにより、responseString() メソッドを呼び出して、ハンドラーを引数として渡すことで Charset.UTF-8 にリクエストを非同期的に実行できます。

ハンドラーは、型 RequestResponse、および Result の 3つのパラメーターを受け取り、値を返さないことを意味する Unit を返すラムダ関数です。 Result に関心があるので、FailureSuccess を呼び出します。どちらも、アプリケーションがそれぞれ失敗または成功したときに結果を提供します。

when() メソッドは、Java の switch と同じであり、リクエストが成功したか失敗したかを判断するのに役立ちます。 このコードを実行して、出力が次のようになっていることを確認します。

[{"id":18,"countryName":"Kenya"},
{"id":20,"countryName":"Tanzania"},
{"id":21,"countryName":"Ethiopia"},
{"id":22,"countryName":"Malawi"},
{"id":23,"countryName":"Country"},
{"id":24,"countryName":"Country"},
{"id":25,"countryName":"Kenya"},
{"id":26,"countryName":"Country"},
{"id":27,"countryName":"USA"},
{"id":28,"countryName":"USA"},
{"id":29,"countryName":"Kenya"},
{"id":30,"countryName":"Kenya"}]

OkHttp API を使用して Kotlin で HTTP リクエストを作成する

Main.kt ファイルの前の例についてコメントし、次のコードをコピーしてファイルに貼り付けます。

import okhttp3.OkHttpClient
import okhttp3.Request

private val httpClient = OkHttpClient()

fun getCountriesUsingOkHttp() {
    val countriesRequest = Request.Builder()
        .url("https://countryapp254.herokuapp.com/country/all")
        .build();

    httpClient.newCall(countriesRequest).execute().use { countryResponse ->
        if (!countryResponse.isSuccessful) throw RuntimeException("status code $countryResponse");

        println(countryResponse.body!!.string())
    }
}

fun main(){
    getCountriesUsingOkHttp();
}

OkHttpClient() は、サーバーへの HTTP リクエストを作成するために使用できる共有 API インスタンスを作成します。

各クライアントにはスレッド プールと接続プールがあるため、共有インスタンスが作成されます。メモリを節約し、待機時間を短縮するには、それらを再利用することが重要です。

Builder() は、提供された URL を使用して Request を作成し、サーバーへのリクエストを準備するために、OkHttpClient() インスタンスから newCall() メソッドを呼び出し、Request を渡します。 このメソッドの引数として。

newCall() メソッドは Call を返し、execute() メソッドを呼び出して Response.body() からリクエストのレスポンスを取得します。 use() 拡張関数は、応答のデータにアクセスしてコンソールに記録するのに役立ちます。

use() 関数は、例外がスローされたかどうかに関係なく、結果を閉じることに注意してください。 このコードを実行して、出力が次のようになっていることを確認します。

[{"id":18,"countryName":"Kenya"},
{"id":20,"countryName":"Tanzania"},
{"id":21,"countryName":"Ethiopia"},
{"id":22,"countryName":"Malawi"},
{"id":23,"countryName":"Country"},
{"id":24,"countryName":"Country"},
{"id":25,"countryName":"Kenya"},
{"id":26,"countryName":"Country"},
{"id":27,"countryName":"USA"},
{"id":28,"countryName":"USA"},
{"id":29,"countryName":"Kenya"},
{"id":30,"countryName":"Kenya"}]

まとめ

このチュートリアルでは、Kotlin で HTTP リクエストを作成するために活用できるさまざまな方法を学びました。 私たちがカバーしたアプローチには、Retrofit の使用、Java 標準ライブラリの API の使用、Fuel API の使用、そして最後に OkHttp API の使用が含まれます。

これらが使用できる唯一のアプローチではないことに注意してください。 Volley API など、使用できる他のアプローチがあります。 ユースケースに適した方法を自由に使用してください。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub