Kotlin에서 HTTP 요청 생성

David Mbochi Njonge 2023년6월20일
  1. Kotlin 프로젝트 생성 및 종속성 추가
  2. Retrofit을 사용하여 Kotlin에서 HTTP 요청 생성
  3. 자바 표준 라이브러리의 API를 사용하여 Kotlin에서 HTTP 요청 생성
  4. Fuel API를 사용하여 Kotlin에서 HTTP 요청 생성
  5. OkHttp API를 사용하여 Kotlin에서 HTTP 요청 생성
  6. 결론
Kotlin에서 HTTP 요청 생성

HTTP는 웹용 통신 프로토콜이며 웹 서버에서 웹 브라우저로 웹 콘텐츠를 제공하는 역할을 합니다.

웹 콘텐츠는 정적 데이터 또는 동적 데이터일 수 있습니다. 정적 데이터는 페이지에 표시되는 정보가 변경되지 않는 반면 웹 페이지에 표시되는 동적 데이터는 항상 변경됨을 의미합니다.

서버에서 검색된 데이터에는 구조화된 데이터, 이미지 및 비디오 파일이 포함됩니다. 대부분의 애플리케이션은 일반적으로 데이터베이스에서 관리하는 구조화된 데이터로 작업합니다.

데이터베이스에서 웹 클라이언트로 데이터를 가져올 때 일반적인 접근 방식은 안정적인 API를 사용하는 것입니다. Restful API는 HTTP 프로토콜을 통해 다양한 라이브러리를 사용하는 애플리케이션에서 사용되며 웹 클라이언트에 로드됩니다.

이 자습서에서는 Restful API를 사용하는 HTTP 요청을 만드는 데 사용할 수 있는 다양한 방법을 배웁니다. Restful API는 Heroku에서 호스팅되는 애플리케이션에서 국가 목록을 반환합니다.

Kotlin 프로젝트 생성 및 종속성 추가

IntelliJ 개발 환경을 열고 파일 > 새로 만들기 > 프로젝트를 선택합니다. 열리는 창에서 프로젝트 namekotlin-http-request로 입력하고 Language 섹션에서 Kotlin을 선택한 다음 Build system 섹션에서 Gradle을 선택합니다.

마지막으로 만들기 버튼을 눌러 프로젝트를 생성합니다.

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"}]

자바 표준 라이브러리의 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();
}

URLConnectionjava.net 패키지의 Java 표준 라이브러리 API이며 Kotlin에서 HTTP 요청을 만드는 데 사용할 수 있습니다.

HttpURLConnectionURLConnection의 인스턴스이며 이를 사용하여 서버에 대한 HTPP 연결을 생성합니다. 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 요청을 생성하는 데 사용할 수 있는 또 다른 접근 방식입니다. 이 예제에서는 String 클래스의 확장 함수인 httpGet()을 호출하여 GET 요청을 하고 있음을 나타냅니다.

문자열은 서버에서 데이터를 가져오는 데 사용되는 RESTful API를 제공합니다.

httpGet() 메서드는 responseString() 메서드를 호출하여 핸들러를 인수로 전달하여 요청을 Charset.UTF-8로 비동기적으로 실행할 수 있는 Request를 반환합니다.

핸들러는 Request, ResponseResult 유형의 세 가지 매개변수를 수락하고 어떤 값도 반환하지 않음을 의미하는 Unit을 반환하는 람다 함수입니다. 결과에 관심이 있으므로 실패성공을 호출하여 각각 애플리케이션이 실패하거나 성공했을 때 결과를 제공합니다.

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