내가 못 찾는것인지 내가 이해하기 어려운건지..
코틀린에서 OKHTTP를 통해 API Body값을 가져오는데
쉽지가 않았다.
설명도 너무 복잡해서 반드시 방법을 알아내면 기록해두겠노라 다짐했다.
여기 그 방법이다.
API를 활용할 떄 RAPID API라는 곳을 사용해봤는데 간단하게 기본 코드가 제공되어서 좋았다.
예시로 RapidAPI에 있는 HolyVible이라는 API를 가지고 설명해보겠다.
1. 먼저, API에서 Kotlin OKHTTP를 클릭후 코드를 복사한다.
사용하기 좋게 기본적인 코드가 다 완성되서 나온다.
다만.. 왕초보는 여기서 body를 가져오는데 헤멜수도 있다. (body는 json타입이라고 한다)
2. Android Studio에 코드를 입력해준다.
val client = OkHttpClient()
val request = Request.Builder()
.url("https://ajith-holy-bible.p.rapidapi.com/GetBooks")
.get()
.addHeader("X-RapidAPI-Key", "- 복사된거 그대로 넣으면 됨 -")
.addHeader("X-RapidAPI-Host", "- 복사된거 그대로 넣으면 됨 -")
.build()
val response = client.newCall(request).execute()
위 코드를 그대로 안드로이드 스튜디오에서 복사해서 MainActivity 코틀린 파일에 넣으면 에러가난다.
뭐 무슨 에러가나긴하는데 아무튼 아래대로 하면 된다.
Thread{
//복사해온 코드 그대로 넣는다.
}
3. 불러온 API BODY값 가져오는 방법
이 부분이 가장 빡치는 부분이였다. 위에 나와있는 값을 가져와야하는데 이상한 값만 가져오고 검색을 해봐도
초보는 이해할 수 없는 설명과 함께 난잡한 코드들 때문에 간신히 방법을 찾아내어, 백업용으로 내가 작성해본다.
따라서, 굴러가기만 하게끔 방법을 포스팅해본다.
var str_response = response.body()!!.string()
val jsonobj: JSONObject = JSONObject(str_response)
2번에 나와있는 코드 밑에 바로 저 코드를 붙여놓으면 만사 OK이다.
저것때문에 고생한게 좀 빡치긴한다.
저게 Body값을 불러온다. 아직 끝 아님.
4. 여기서 Body로 가져온 값에서 특정 부분을 가져오는 방법
내가 사용한 API는 성경API인데, 여기서 Body부분을 보니 The_Old_Testament와, The_New_Testament가 있다.
나는 The_Old_Testament 부분만 가지고와서 TextView에 뿌려주고 싶었다.
코드는 아래와 같다.
binding.HolyVible.text = jsonobj.getString("The_Old_Testament").toString()
이렇게하면, TextView에 성경에 있는 "The_Old_Testament"값을 넣어주어 화면으로 띄울 수 있게 된다.
하지만!! 한가지 주의할 점은 이 상태로 진행하면 에러가 발생한다.
스레드 어쩌고 또 에러가 나는데 이것도 골아프지만
runOnUiThread {
//이 쪽에 UI가 변경되는 부분의 코드를 넣으면 됨
}
요 코드 안 쪽에 UI 변경되는부분을 넣어주면 골아픈게 해결된다.
코드를 합쳐보면 아래와 같다.
5. 최종 코드 합친 부분
class MainActivity : AppCompatActivity() {
private var mBinding: ActivityMainBinding? = null
private val binding get() = mBinding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
thread {
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.HolyVible.text = "테스팅"
val client = OkHttpClient()
val request = Request.Builder()
.url("https://ajith-holy-bible.p.rapidapi.com/GetBooks")
.get()
.addHeader("X-RapidAPI-Key", "b8e0b3c863msh3a67435b8d5df9dp14b7bajsn7d19a8ce7a6b")
.addHeader("X-RapidAPI-Host", "ajith-holy-bible.p.rapidapi.com")
.build()
val response = client.newCall(request).execute()
var str_response = response.body()!!.string()
val jsonobj: JSONObject = JSONObject(str_response)
runOnUiThread {
binding.HolyVible.text = jsonobj.getString("The_Old_Testament").toString()
}
}
}
6. 결과값
간단하지만 모르면 진짜 어렵다는걸 다시 한 번 꺠달았다..
'프로그래밍 > 안드로이드 스튜디오(Kotlin)' 카테고리의 다른 글
코틀린 NavigationView 아이템 색상 변경하는 법 (회색 일 때) (0) | 2023.02.22 |
---|---|
코틀린 툴바(TOOLBAR)에 버튼 추가하는 방법 (0) | 2023.02.22 |
Kotlin(코틀린) Fragment에서 runOnUiThread 사용하는 법 (0) | 2023.02.17 |
코틀린(Kotlin) 텍스트뷰, 타이핑 치는 효과 내는 법(코루틴 활용) (0) | 2023.02.11 |
코틀린 Only the original thread that created a view hierarchy can touch its views. (0) | 2023.02.11 |