[Android] Retrofit

호야·2022년 7월 21일
0
post-thumbnail

Retrofit 이란

Retrofit 은 서버와 클라이언트 간 http 통신을 위한 라이브러리이다.
쉽게 말해 안드로이드 개발시 API를 쉽게 호출할 수 있도록 도와준다.

Retrofit 사용 방법

1. Gradle 의존성 추가

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

두 번째 converter-gson 은 json 으로 날아온 응답 값을 객체로 변환해주는 라이브러리이다.

2. AndroidManifest 퍼미션 추가

<uses-permission android:name="android.permission.INTERNET"/>
<application
             ...
             android:usesCleartextTraffic="true" 
              >

안드로이드 9.0 파이부터는 https 사용을 강제하기 때문에 Api 주소가 https 가 아닌 http 이면 usesCleartextTraffic 을 true로 해주어야 한다
설정을 해주지 않으면 "CLEARTEXT communication to XXXX not permitted by network security policy" 라는 에러가 발생한다.

3. Interface 정의

interface RetrofitService {

    @GET("todos/1") // 요청메소드 GET, baseUrl에 연결될 EndPoint 'posts/1
    fun getUser(): Call<JsonplaceholderResult>
    
}

4. Retrofit 인스턴스 생성

object RetrofitClient {

    inline fun <reified T> create(baseUrl: String): T {
        return Retrofit.Builder()
            .baseUrl(baseUrl) // baseUrl은 반드시 /로 끝나야 하며 아니면 에러가 발생
            .addConverterFactory(GsonConverterFactory.create()) // Json을 변환해주는 Gson 변환기 등록
            .build().create(T::class.java)
    }

}

Api 결과 값 출력

private val retrofitService by lazy {
        RetrofitClient.create<RetrofitService>("http://jsonplaceholder.typicode.com/")
}

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        retrofitService.getUser().enqueue(object: Callback<JsonplaceholderResult> {
            override fun onResponse(
                call: Call<JsonplaceholderResult>,
                response: Response<JsonplaceholderResult>
            ) {
                if (response.body() != null) {
                    Log.d("ApiTest", response.body().toString())
                }
            }

            override fun onFailure(call: Call<JsonplaceholderResult>, t: Throwable) {
                Log.d("ApiTest", "실패 ${t.message}")
            }

        })
        
}

0개의 댓글