티스토리 뷰

반응형

샘플 앱 : github.com/seyoungcho2/APIRequest

  • 환경 세팅 : 레트로핏을 사용하기 위해서는 3가지 파일을 변경 해야한다.

1. 모듈 수준의 build.gradle에 아래 implentation 3개 추가

dependencies {
    implementation 'com.squareup.okhttp3:logging-interceptor:4.2.1' // Logger Library
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // Json을 받아와 자동으로 객체로 Convert
    implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Retrofit Library
    ...
}

2.  AndroidManifest.xml에 INTERNET Permission 추가

<manifest 
	...>

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

    <application
    ...
    />

  • 코드 작성

1. Retrofit 객체를 싱글톤으로 만들 수 있도록 생성

object RetrofitClient {
    private var instance: Retrofit? = null 
    private val gson = GsonBuilder().setLenient().create() //gson가져오기 밑에서 자동 converting 세팅 할 때 씀
    private const val BASE_URL = "http://api.teamcarelab.com" // 기본 URL은 무조건 "/"전까지만 쓰기


    fun getInstance(): Retrofit {
    
    	//Logger 만들기
        val interceptor = HttpLoggingInterceptor() 
        interceptor.apply { interceptor.level = HttpLoggingInterceptor.Level.BODY }
        
        
        val client: OkHttpClient = OkHttpClient.Builder().addInterceptor(interceptor).build()
        if (instance == null) {
            instance = Retrofit.Builder()
                .baseUrl(BASE_URL) // 기본 URL 세팅
                .client(client) //Logger 세팅
                .addConverterFactory(GsonConverterFactory.create(gson)) //Json을 자동으로 data class로 convert하는 부분
                .build()
        }

        return instance!!
    }
}

2. RetroFit에서 가져올 데이터 클래스 만들기

*Json 예시

{
    "data": [
        {
            "playerId": 2894,
            "firstName": "Chris",
            "heightFeet": null,
            "heightInches": null,
            "lastName": "Morris",
            "fullName": "Chris Morris",
            "position": "",
            "teamId": 3,
            "team": "BKN",
            "firstGameDate": "1988-11-04",
            "lastGameDate": "1999-05-12"
        },
        {
            "playerId": 1692,
            "firstName": "Adam",
            "heightFeet": null,
            "heightInches": null,
            "lastName": "Morrison",
            "fullName": "Adam Morrison",
            "position": "",
            "teamId": 4,
            "team": "CHA",
            "firstGameDate": "2006-11-01",
            "lastGameDate": "2010-06-13"
        }
    ]
}

 Json이 위와 같이 있을 때 "data" 속에 Player List가 있으므로( "data" : [ {Player}, {Player} ]) 아래와 같이 짜야한다.

[...]: List

{...} : 객체

data class PlayerList(
    @SerializedName("data")
    val playerList : List<Player>
)

data class Player(
    val playerId: Int,
    var firstName: String,
    var heightFeet: String,
    var heightInches : String,
    var lastName: String,
    var fullName : String,
    var position : String,
    var teamId : Int,
    var team : String,
    var firstGameDate : String,
    var lastGameDate : String
)

3. 위의 데이터를 가져올 인터페이스 작성

interface RetrofitService {

    //Request URL : http://api.teamcarelab.com:18393/api/player?name=morris
    @GET("api/player")  //@GET 뒤에 기본 URL 뒤에 들어갈 경로가 들어간다.
    fun requestList(
        @Query("name") name: String  // @Query안에 ? 뒤에 들어갈 변수가 들어간다.
    ) : Call<PlayerList>
}

4. Activity에서 위의 정보를 활용하여 Request 날리기

class MainActivity : AppCompatActivity() {

    private lateinit var retrofit : Retrofit
    private lateinit var supplementService : RetrofitService
    lateinit var textView : TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        retrofit = RetrofitClient.getInstance() // retrofit 초기화
        supplementService = retrofit.create(RetrofitService::class.java) // 서비스 가져오기

		...
        
        findViewById<Button>(R.id.button).setOnClickListener {
            getSearchList(supplementService, "morris")
        }
    }


    private fun getSearchList(service: RetrofitService, keyword: String){
        service.requestList(keyword).enqueue(object : Callback<PlayerList> {
            override fun onFailure(call: Call<PlayerList>, error: Throwable) {
                Log.d("TAG", "실패 원인: {$error}")
            }

            override fun onResponse(
                call: Call<PlayerList>,
                response: Response<PlayerList>
            ) {
                Log.d("TAG", "성공")
                textView.text = response.body().toString()
                //reponse.body()는 PlayerList를 반환한다.
            }
        })
    }
}

하면 결과 값이 다음과 같은 결과가 출력된다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함