달달한 스토리

728x90
반응형

출처 핀터레스트

 

rxjava와 레트로핏을 다음과 같이 사용하였다.

 

CompositeDisposable 객체를 만들고,

 

다음과 같이 네트워크를 호출하였다.

 

    val disposable = CompositeDisposable()
    
    disposable.add(
            RetrofitClient.getRetrofitInstance(application)
                ?.getProductList(
                    user?.authCompanyCode,
                    getAuthKey(application),
                    user?.mobileUid,
                    user?.sessionId,
                    pageNo,
                    pageSize,
                    "desc"
                )?.subscribeOn(Schedulers.newThread())
                ?.observeOn(AndroidSchedulers.mainThread())
                ?.subscribeWith(object : DisposableSingleObserver<SearchList>() {
                    override fun onSuccess(t: SearchList) {
                        when (t.resultCode) {
                            //SearchList pojo class는 resultCode를 가지고 프로퍼티로 가지고 있다.
                        }
                    }

                    override fun onError(e: Throwable) {
                     	//오늘의 목표는 여기서 바디를 가져오는 것이다.
                    }
                })!!
        )

 

SearchList 포조 데이터 클래스 모델에서 resultCode를 가져와 code에 따른 응답처리를 하였다.

 

onSuccess 메서드에서는 SearchList에 담긴 responseBody를 받을 수 있지만,

 

onError 메서드에서는 Throwable 객체 하나만을 받아올 수 있었다.

 

서버 통신이 올바르게 되었을 때는 200번대 resultCode 떠서(통신상) 자연스럽게

 

onSuccess에서 리절트코드를 받을 수 있지만,

 

서버 개발자가 실수로 400 에러가 떴음에도 에러 바디를 날릴 수도 있다.

 

나의 상황이 그러했다.

 

많이 있는 경우는 아니겠지만, 그래도 에러바디를 받는 법을 기록하는 것이 좋을 것 같아

 

글을 작성한다.

 

나 같은 경우는 onError에서 어떻게 responseBody를 추출해야 할지

 

알아보았다. 방법은 다음과 같다.

 

override fun onError(e: Throwable) {
                        if (e is HttpException) {
                            val error = GsonBuilder().create().fromJson(e.response()!!.errorBody()?.string(), SearchList::class.java)
                            when (error.resultCode) {
                                
                            }
                        }
                    }

우선 레트로핏을 사용한다면 moshi나 gson을 사용할 것이다.(다른 것도 있을 수도 있다.)

 

moshi는 사용경험이 없어 gson으로 설명하겠다.

 

GsonBuilder를 생성하고 create하여 fromJson 메서드를 호출한다.

 

파라미터로는 Throwable 객체에서 response 호출 뒤에 errorbody를 가져와 string메서드를 호출해준다.

 

그리고 참조형으로 우리가 값을 넣어줄 pojo 클래스를 넣어준다.

 

그럼 위 코드와 같이 에러바디를 서버에서 받아와 처리할 수가 있다.

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading