Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 유튜브
- Kotlin
- error
- 안스
- 에러
- 안드로이드
- 스튜디오
- 깃헙
- Android
- coroutine
- MVVM
- 안드로이드 스튜디오
- 안드로이드스튜디오
- dart
- GIT
- 코틀린
- image
- Github
- WebView
- 의존성주입
- ADB
- studio
- Gradle
- build
- viewpager
- 코루틴
- RecyclerView
- 레트로핏
- Retrofit
- 웹뷰
Archives
- Today
- Total
코딩하는 일용직 노동자
네트워크 Response 처리 라이브러리 본문
안드로이드에서 주로 Retrofit2 를 이용해 네트워크를 구현하게 됩니다.
이때, API의 호출결과로 정상적이라면 200이 내려올것이고, 정상적이지 않다면 400, 404, 406, 500 등 다양한 Response가 올 수 있습니다.
Response 처리를 도와주는 라이브러리가 있어서 소개합니다.
Sandwich는 Retrofit Response를 모델링하고 예외를 처리하기 위한 API 라이브러리입니다.
#준비하기
build.gradle 에 라이브러리를 사용하기 위해서 sandwich를 추가한 후 sync now를 눌러줍니다.
allprojects {
repositories {
mavenCentral()
}
}
dependencies {
implementation "com.github.skydoves:sandwich:1.2.4"
}
#사용해보기
제가 예전에 만들어뒀던 샘플 프로젝트에 Sandwich를 적용해보겠습니다.
Retrofit 설정에 .addCallAdapterFactory(ApiResponseCallAdapterFactory.create()) 를 추가해줍니다.
Retrofit.Builder()
.baseUrl(BuildConfig.SERVER_HTTP_URL)
.client(OkHttpClient.Builder().apply {
connectTimeout(30, TimeUnit.SECONDS)
writeTimeout(30, TimeUnit.SECONDS)
readTimeout(30, TimeUnit.SECONDS)
addInterceptor(AddCookieInterceptor())
addInterceptor(ReceivedCookieInterceptor())
}.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
.build().create()
API interface 에는 ApiResponse로 받을 수 있도록 해줍니다.
interface NetworkService {
// 이미지 검색
@GET("api/")
suspend fun searchImage(
@Query("key") key: String,
@Query("q") q: String,
@Query("image_type") image_type: String,
@Query("page") page: Int,
@Query("per_page") per_page: Int
): ApiResponse<ImageObj>
}
ApiResponse 는 3가지 타입을 갖고있습니다.
Success, Failure.Error, Failure.Exception
API를 호출해봅니다.
val response = repository.searchImage(params)
response.onSuccess {
// handles the success case when the API request gets a successful response.
if (this.response.body()?.hits!!.isEmpty()) {
searchResultEvent.sendEvent(SearchResult.Fail(""))
} else {
imageListData = this.response.body()?.hits
searchResultEvent.sendEvent(SearchResult.Success)
}
}.onError {
// handles error cases when the API request gets an error response.
searchResultEvent.sendEvent(SearchResult.NetworkError)
}.onException {
// handles exceptional cases when the API request gets an exception response.
this.exception.printStackTrace()
}
#소감
예제가 매우 심플한편이라 복잡한 Response는 테스트해보지 못했습니다.
하지만 사용해보니 기존에 사용하던 Response코드보다 훨씬 간단하게 처리가 가능했습니다.
다음에 기회가 있다면 회사 업무 프로젝트에 Sandwich를 이용해보도록 해야겠습니다.
'안드로이드' 카테고리의 다른 글
Invoke-customs are only supported starting with Android O (--min-api 26) 에러 수정하기 (0) | 2022.04.20 |
---|---|
모바일용 FFmpeg 라이브러리 (0) | 2022.04.20 |
안드로이드 라이브러리 배포하기 - Github, jitpack (1) | 2022.04.14 |
gradle allprojects 오류 해결. (1) | 2022.04.13 |
맥북(Big Sur포함) 안드로이드 USB 테더링 하기 (4) | 2022.03.27 |