관광공사의 Tour Api 국문관광정보 활용 작업 중
Retrofit 으로 api와 통신하는 과정에서
해결이 어려웠던 오류
W/System.err: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 79 path $.response.body.items
json 데이터를 받아오는 데 받아오는 json내용 중간에 { }가 아닌 [ ]로 감싸진 배열형태가 존재
그 부분에서 에러가 남
에러 메세지 내용 : Expected BEGIN_OBJECT but was STRING.. 즉 { }가 올 자리에 [ ]가 있어서 오류가 났다
json의 이런 형태는 흔하게 볼 수 있지 않나??
이걸 해결하는 방법이 없다는 게 말이 안된다고 생각됨
쉽사리 해결방법이 나오지 않는데 계속 찾아봄
실험용 프로젝트폴더도 새로 만듦
retrofit json array 받는 법.. 변환하는 법.. Expected BEGIN_OBJECT but was STRING...
마주쳤던 방법들
- POJO클래스를 [ ] 이 부분만 따로 만들어라 : 만들어보려고 했는데 코틀린으로 작성하는 법을 찾아보니 코틀린의 data class가 자바의 POJO클래스의 진화된 형태..?인 것 같아 포기(나는 이미 data class를 사용중)
- [ ] 이 부분을 List<>로 받아야 한다 : 이미 그렇게 data class 짜뒀음
- OkHttpClient를 함께 사용해서 OkHttpClient의 HttpLoggingInterceptor로 http통신의 자세한 기록을 로그로 출력해 확인해봐라 : HttpLoggingInterceptor로 로그 찍는 걸 시도
중이나 아무것도 안 찍힘. 내가 뭘 잘못한 건지 아니면 통신이 중간에 오류로 중단되는 거라 찍힐 로그가 없는 건지 판단이 안 되는 중(바보같은 실수였음)-> 로그찍기 성공! 오류나기 전까지 받아온 데이터의 모습을 확인할 수 있었다. 확인해보니 뭔가 이상함
E/: <-- 200 OK http://api.visitkorea.or.kr/openapi/service/rest/KorService/searchKeyword?ServiceKey=(서비스 키)&keyword=%25EA%25B0%2595%25EC%259B%2590&MobileOS=AND&MobileApp=AppTest&_type=json (3105ms) Date: Wed, 04 Aug 2021 06:30:08 GMT Content-Length: 123 Access-Control-Allow-Origin: * Content-Type: application/json E/: {"response":{"header":{"resultCode":"0000","resultMsg":"OK"},"body":{"items":"","numOfRows":10,"pageNo":1,"totalCount":0}}} <-- END HTTP (123-byte body)
1. totalCount가 0임.. items에서 오류가 나는 게 검색결과값이 없어서 값이 아니라 빈 문자열""이 오기 때문이었나 의심됨
2. 검색 키워드로 보낸 부분이 이상함. 내가 입력한 검색어를 16진수로 바꾼 형태가 저렇게 길지 않았는데??
해당 부분을 확인해보자
1. 오퍼레이션 명세를 보니 totalCount는 검색결과 수를 의미하는 값이 맞음. 즉 응답할 검색결과가 없음
2. 나는 관광공사에서 보여준 예시와 똑같은 검색어인 "강원"를 사용했는데, 관광공사 url 예시의 keyword값(%EA%B0%95%EC%9B%90)이 내 값과 다름. 한글 키워드값을 UTF8로 변환하는 과정에서 문제가 있었던 걸로 예상. 하지만 변환 후 값을 Log로 확인했을 땐 예시와 똑같아서 잘 변환했다고 생각했는데 아니었던 것으로 보임..
-> 일단 관광공사 예시에 있는 이미 변환되어있는 값을 keyword에 넣어 다시 요청보내봄
-> 내가 변환하는 과정없이 그대로 넣어서 보냈는데도 위 사진과 같은 이상한 값으로 url에 들어감ㅋㅋㅋㅋㅋㅋㅋ이게 뭐지?
의심 1. Retrofit에서 내가 준 값을 문자열로 인식하고 자동으로 변환하는 과정을 거쳐버린 건가??
-> 그런거라면 "강원"이라는 문자열을 그대로 넣어보자
(-> 이게 안되면 일단 kotlin에서 한글을 utf8로 변환하는 방법을 다시 찾아서 방법을 시도해봄)
됐다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~~~!!~~~!!~!~~~!
드디어 데이터가 받아진다.......... 로그 찍혔다,,,,,,,,,,, keyword부분 값도 내가 원하는 값이 자동으로 변환되어서 들어갔다
이 오류를 이제 그만 볼 수 있다
하
오늘도 되새긴 것
역시.. 컴퓨터는 거짓말 안해
^^
해결 : 알게 된 것
- Retrofit은 url에 넣을 값들 중 문자열이 있으면 알아서 UTF8(인지 확실치는 않지만 url에 들어갈 수 있는 형태..? 이건 더 알아봐야 겠다)로 변환해준다.
- HTTP통신 중 오류에 대한 자세한 사항을 로그로 보고 싶다면 OkHttpClient를 함께 사용해서 OkHttpClient의 HttpLoggingInterceptor를 활용하자
이제 데이터 받아서 연결시켜주고
최종적으로는 검색결과가 없는 경우를 오류없이 처리해야한다.
아자아자!
참고
httpLoggingInterceptor를 활용해라 : https://okky.kr/article/432782
Retrofit과 okhttp, httpLoggingInterceptor 사용법 : https://jwsoft91.tistory.com/35
'Android > API' 카테고리의 다른 글
[KakaoLogin] 카카오 계정 연동 로그인 구현하기 (Kotlin) (0) | 2022.03.03 |
---|---|
메모) Android Api 서버 통신 Retrofit 활용하기 (0) | 2021.08.08 |
[Android/Kotlin] 카카오맵 KakaoMap API 지도 좌표 띄우기, 마커 표시 : MapPoint (0) | 2021.07.23 |
[Android/Kotlin] 카카오맵 KakaoMap API 시작하기 : MapView, 초기설정 (2) | 2021.07.23 |