Retrofit의 장점
- 빠른 성능을 가지고 있고 JSON Parsing을 GSON이 대신 해주기 때문에 데이터 파싱도 편리하다.
- 서버 도메인 주소가 아닌 말단 주소를 따로 관리해줄 수 있다.
- 따로 별도의 작업을 하지 않아도 통신하는 부분은 알아서 Thread에서 돌아간다.
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // JSON 형식으로 온 데이터를 객체로 mapping해주는 Converter
<uses-permission android:name="android.permission.INTERNET" />
class Person(
var id : Int? = null,
var name : String? = null,
var age : Int? = null,
var intro : String? = null
): Serializable
// retrofit 생성
val retrofit = Retrofit.Builder()
.baseUrl("http://mellowcode.org/") // 서버 도메인 주소(변하지 않는 주소)
.addConverterFactory(GsonConverterFactory.create()) // gson 과정을 자동으로 해줌
.build()
interface RetrofitService {
@GET("json/students/") // GET 방식으로 baseUrl + "json/students/"에 요청하겠다.
fun getStudentsList() : Call<ArrayList<Person>> // 요청에 대한 response type은 ArrayList<Person>로 하겠다.
}
파라미터로 상세 주소를 더 받아오기
- 예시
@Get("json/students/{id}") fun getStudentsList( @Path("id") id : String ) : Call<ArrayList<Person>>
매개변수로 받은 id값을 url 주소의 {id}로 넘겨준다.
val service = retrofit.create(RetrofitService::class.java)
service.getStudentsList().enqueue(object : Callback<ArrayList<Person>>{
// 통신이 성공했을 때 호출된다.
override fun onResponse(
call: Call<ArrayList<Person>>,
response: Response<ArrayList<Person>>
) {
if(response.isSuccessful){
// list로 데이터 받아옴
val personList = response.body()
// status 코드를 받아옴
val code = response.code()
// error인 상황이지만 code가 200번대인 경우에 에러메세지를 띄우고싶을 때 사용
val error = response.errorBody()
// 응답의 header정보를 받아옴
val header = response.headers()
}
}
// 통신이 실패했을 때 호출된다.
override fun onFailure(call: Call<ArrayList<Person>>, t: Throwable) {
// 통신이 원활하지 않거나 데이터를 표시할 수 없는 등 통신이 실패한 경우
// 왜 실패했는지 검사하는 코드 예시
if(call.isCanceled){
}
if(call.isExecuted){
}
// 통신이 실패했을 때 바로 연결을 끊는 것이 아니라 retry를 하는데, 한번 실패하면 retry하지 않도록
call.cancel()
}
})
response.isSuccessful
- request code가 200번대일 때 true를 return 한다.
- 대부분의 200번대의 코드가 정상 작동했음을 의미한다.