본문 바로가기
프로그래밍/안드로이드 스튜디오(Kotlin)

코틀린 RapidApi / OKHTTP에 있는 BODY값 가져오기

by 최상급 정보 콜렉터 2023. 2. 11.

내가 못 찾는것인지 내가 이해하기 어려운건지..

코틀린에서 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. 결과값

 

 

간단하지만 모르면 진짜 어렵다는걸 다시 한 번 꺠달았다..