물에 살고싶은 개발자

Retrofit2로 도로명주소 공공데이터 API 가져올때 주의할점 본문

Android

Retrofit2로 도로명주소 공공데이터 API 가져올때 주의할점

돼지사랑 2020. 6. 29. 11:29

이번에 도로명주소 검색을 구현하면서 이것저것 써봣는데, 다음지도는 웹뷰를 띄워야하고 뷰 커스텀 하기에도 적절치 않아서 찾아보다가

도로명주소 공공데이터 api 를 발견했다. 아무튼 이 api를 사용하는데에 있어 시행착오를 기록해둘 목적으로 글을 작성한다.


언제나 그랫듯 선결론 ! 

공공데이터가 다 그런지는 모르겠는데 도로명주소 api는 json타입으로 데이터를 요청하면 맨앞과 맨뒤에 괄호() 가 붙어서 Retrofit에 gson컨버터로는 파싱이 안된다...ㅠㅠ 

그렇기때문에 레트로핏 빌드 시 아래와 같이 해서 String으로 받아와야 한다.

아래는 빌드 시 코드

        mRetrofit = Retrofit.Builder()
.baseUrl("http://www.juso.go.kr/")
.client(client)
// .addConverterFactory(GsonConverterFactory.create())
// .addConverterFactory(GsonConverterFactory.create(gson))
.addConverterFactory(ScalarsConverterFactory.create())
// .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
api = mRetrofit.create(AddressAPI::class.java)

여기는 서비스 인터페이스

//    @Headers("Content-Type: application/json")
@GET("addrlink/addrLinkApiJsonp.do")
fun searchAddress(
@Query("confmKey") confmKey: String,
@Query("resultType") resultType: String,
@Query("currentPage") currentPage: String,
@Query("countPerPage") countPerPage: String,
@Query("keyword") keyword: String
): Call<String>

아래는 구현부

val call = api.searchAddress(confirmKey, resultType, currentPage, countPage, keyword)
call.enqueue(object : Callback<String> {
override fun onFailure(call: Call<String>, t: Throwable) {
Log.e(TAG, "onFailure: 실패! -> ${t.toString()}");
}

override fun onResponse(call: Call<String>, response: Response<String>) {
Log.e(TAG, "onResponse: 성공! -> ${response.body().toString()}")
txt_address.text = response.body().toString()

}
})


이렇게 해야만 onResponse() 콜백이 호출되며 api 호출이 성공적으로 마무리된다.


--------------------------------------------------------------------------------------------------------------------------------------------------


그럼 위처럼 한 자세한 내용은 아래에서 이어진다.


일단 주석처리한것들부터 설명하자면..

빌드 시 컨버터팩토리 추가하는 부분에서 gson컨버터를 추가하면 스칼라컨버터를 추가하더라도 gson이 먼저 동작해서 api호출이 fail로 돌아간다.

그렇게 호출이 fail 로 돌아가면, 

JSON document was not fully consumed 에러가 나게 된다. (사실 그 전에 setLenient() 관련 에러도 나는데 이건 뭐..gson 옵션 추가하면 되는부분이니 패스)

문제는 JSON document was not fully consumed 에러의 대처법에 대한 솔루션이 딱히 없다는건데..갓택오버킹로우만 봐도 대부분 서버에서 json문법을 틀렸니 어쩌니 하는 내용밖에 나오지 않는다. 근데 사실 그게 원인인건 맞기때문에, 그냥 String으로 받아올순 없나 라고 생각했다. 근데 추가를 해도 계속 오류가 나길래 뭔가 했더니 주석처리를 하고나서야 제대로 동작했다.


추가로 헤더를 json으로 하면 된다그랬는데 애초에 json인건 맞기때문에...괄호가 문제된것이기때문에 의미가 없다.

아무튼 위 예제처럼 하면 정상적으로 String으로다가 받아올 수 있다. 


--------------------------------------------------------------------------------------------------------------------------------------------------


추가로..해당 이슈를 공유했더니 옆에있는 아이폰개발자분이 url 다른거 쓰면 괄호없이 정상적인 json이 온다고 알려주셧다 ㅠㅠ


위에 있는 url 대신 http://www.juso.go.kr/addrlink/addrLinkApi.do 이 url을 사용하면 괄호없이 아무문제없는 정상적인 json파일을 받을수있다...ㅎ..


아무튼 이걸로 끝!


끝!

Comments