티스토리 뷰
반응형
샘플 앱 : 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
링크
TAG
- sealed class 안정성
- Kotlin sealed class 상속
- 코틀린 also
- sealed class 특징
- sealed class 상속
- HTTP 100 Continue
- HTTP 201
- ZonedDateTime
- REST JSON
- sealed class enum
- REST API GET
- sealed class 1.5.0
- 500 Internal Server Error
- LocalDateTime
- REST API POST
- REST API PUT
- REST xml
- sealed class 사용 방법
- HTTP 401 Unauthorized
- REST API란 무엇인가?
- HTTP 400
- HTTP 204
- REST API HTML
- java
- Kotlin sealed class
- REST API Plain Text
- Android
- HTTP 404 Not Found
- HTTP 301 Moved Permanently
- kotlin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함