Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[Android] Retrofit 본문

Project/대중교통 길찾기

[Android] Retrofit

Seung__ 2022. 5. 1. 20:35

1. Retrofit


Retrofit은 HTTP API 통신을 돕는 라이브러리로 쉽고 사용이 간단하다.

 

 

2. 의존성 추가


// Retrofit
implementation "com.squareup.retrofit2:retrofit:2.9.0"
// Retrofit with Moshi Converter
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
// GSON
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

Gradle에 의존성을 추가.

보통 서버에 JSON을 통해 요청하거나 서버로부터 응답을 받는다. 

이 떄 Gson라이브러리를 사용하면 Json Object<--> Kotlin Class로 변환이 가능하다.

 

 

3. 인터넷 사용 권한 추가


AndroidManifiest.xml에 다음과 같이 인터넷 권한을 부여하자.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

 

4. Dataclass생성


 

[Android, Kotlin] JSON to Kotlin Class

Retrofit사용 시 요청이 계속 fail이 나서 검색하던 중 Json to Kotlin class 라는 plugin을 알게되었다. 응답 받을 또는 응답을 줄 json samle을 입력하면 이에 맞춰 클래스를 생성하는 기능을 제공한다... sett.

bsh-developer.tistory.com

 

 

5. 인터페이스 생성


interface RetrofitApi {

    @GET("/withJson")
    fun getData(@Query("start") start: String, 
                @Query("middle") middle: String, 
                @Query("end") end: String
                ): Call<JsonResult>
}

Retrofit을 통해 사용할 메서드을 정의.

 

이 때 Call<>에는 Json을 어떤 타입으로 변환할지 지정.

 

 

6. Retrofit 객체 생성


object PathClient {

    private val pathClient: Retrofit.Builder by lazy {
        Retrofit.Builder()
            .baseUrl("~~~~")
            .addConverterFactory(GsonConverterFactory.create())
    }

    val pathService: RetrofitApi by lazy {
        pathClient.build().create(RetrofitApi::class.java)
    }

}

 

Retrofit 객체를 Object로 만들어서 싱글톤으로 만들어 주자.

해당 객체를 Retrofit을 초기화  하고 호출 시 가져오는 역할을 한다.

lazy로 실체 호출 시 초기화 하도록 했다.

이전에 만든 interface응 create 메서드에 전달한다.

 

 

7. Retofit 사용


Fragment나 Activity에서 다음과 같이 사용할 수 있다.

val callGetPathData = PathClient.pathService.getData(startTextView.text.toString(),
    middleTextView.text.toString(),
    endTextView.text.toString()
)

callGetPathData.enqueue(object : Callback<JsonResult>{
    override fun onResponse(call: Call<JsonResult>, response: Response<JsonResult>) {
        if(response.isSuccessful){
            //성공처리
                val result = response.body() as JsonResult

            viewModel.setResultDate(result)

            it.findNavController().navigate(R.id.action_searchFragment_to_resultFragment)

        }else{
            Log.d("[Retrofit-response]", response.message().toString())
            Toast.makeText(requireContext(), "응답을 가져오는데 실패했습니다.", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onFailure(call: Call<JsonResult>, t: Throwable) {
        Log.d("[Retrofit-fail]", t.message.toString())
        Toast.makeText(requireContext(), "요청에 실패했습니다.", Toast.LENGTH_SHORT).show()
    }
})

 

'Project > 대중교통 길찾기' 카테고리의 다른 글

[Android] Fragment, Navigation,  (0) 2022.05.01
Json Viewer 추천  (0) 2022.05.01
[Android, Kotlin] JSON to Kotlin Class  (0) 2022.04.30
Background Process : nohup  (0) 2022.04.19
[Android] API 요청  (0) 2022.04.19
Comments