상상하라 그리고 현실로 만들어라.

상상하는 모든 것이 미래다.

Kotlin과 Android/Android

코틀린으로 안드로이드의 HttpURLConnection 구현하기

월터제이(Walter J) 2020. 12. 15. 09:00

안녕하세요, 반갑습니다!

 

안드로이드는 데이터 통신을 위해서 HttpURLConnection 클래스와 보안성이 강화된 HttpsURLConnection 을 지원합니다.

그래서 웹 페이지로부터 데이터를 가져올 수 있는데요.

오늘은 안드로이드에서 지원하는 데이터 통신 방법을 정리해보겠습니다.

 

 

 

HttpURLConnection 구현해서

데이터 통신하기!

 

 

 

1. 인터넷 연결을 위한 INTERNET 권한 설정

HttpUrlConnection 역시 인터넷 연결을 필요로 합니다.

따라서 인터넷에 접근할 수 있는 권한을 설정해줘야 합니다.

 

AndroidManifest.xml 파일을 열어 아래와 같이 입력해줍니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.exhttpurlconnection">

    <uses-permission android:name="android.permission.INTERNET"/> //인터넷 접근 권한
    .
    .
    .
/>

 

 

2. HttpUrlConnection 설정하기

일반적으로 네트워크 작업은 백그라운드 스레드에서 작동해야 합니다.

다운로드를 받는 등의 시간이 오래 걸리는 작업이기 때문이지요.

만약 메인 스레드에서 네트워크 작업을 한다면, 사용자는 완료되기만 기다려야 하겠죠?

 

그래서 별도의 thread 를 실행해줍니다.

아래는 코틀린에서 제공하는 thread 사용 방법입니다.

btnSubmit.setOnClickListener {   //버튼 클릭시,
    thread(start = true) {    //별도의 thread 실행
        .
        . 
        .
    }
}

 

2. HttpURLConnection

접근할 웹페이지를 HttpURLConnection 으로 연결합니다.

이때 안드로이드는 URL() 객체에 대한 예외 처리를 해주어야 합니다.

try {
    var urlText = editAddress.text.toString()

    val url = URL(urlText)
    val netConn = url.openConnection() as HttpURLConnection
    .
    .
    .
} catch (e: Exception) {
    e.printStackTrace()
}

 

이렇게 해주면 해당 웹페이지 URL 에 접근하게 됩니다.

url.openConnection() as HttpURLConnection 으로 HttpURLConnection 객체를 만듭니다.

 

이제 연결은 했으니, 어떻게 데이터를 요청하고 받을 것인지 설정해야 합니다.

다음은 HttpURLConnection 의 각 속성들입니다.

Method KEY VALUE 내용
netConn.setConnectTimeout() - 1000ms(1초) 서버 접속시 연결 시간을 설정합니다.(ms(밀리초) 로 지정)
netCon.setReadTimeout() - 1000ms(1초) 읽기 시간을 설정합니다(ms(밀리초) 로 지정)
netConn.requestMethod - GET / POST GET 또는 POST 방식으로 데이터를 요청 합니다.
netConn.setRequestProperty() Accept application/xml 응답 결과를 xml 형태로 받길 요청합니다.
Accept application/json 응답 결과를 json 형태로 받길 요청합니다.
Content-Type text/html 요청시 text/html 형태로 전달합니다.
Content-Type application/xml 요청시 application/xml 형태로 전달합니다.
Content-Type application/json 요청시 application/json 형태로 전달합니다.
Cache-Control no-cache 캐시를 설정합니다.
con.setDoOutPut() - False / True OutputStream 으로 서버에 요청할 것을 결정합니다.
con.setDoInput() - False / True InputStream 으로 응답받을 것을 결정합니다.

 

 

netConn.requestMethod 를 비롯해 위의 속성들을 사용해서 데이터를 요청할 수 있습니다.

 

 

3. 데이터 수신하기

            .
            .
            .
            if (netConnection.responseCode == HttpURLConnection.HTTP_OK) {
                val streamReader = InputStreamReader(netConnection.inputStream)
                val buffered = BufferedReader(streamReader)

                val content = StringBuilder()
                while (true) {
                    val line = buffered.readLine() ?: break
                    content.append(line)
                }

                buffered.close()
                netConnection.disconnect()
                runOnUiThread {
                    textView.text = content.toString()
                }
            }
        } 
    }
}

 

HttpURLConnection.HTTP_OK 는 연결 성공을 나타내는 응답코드 200 을 가집니다.

 

웹 서버의 응답 코드가 궁금하신 분은 HTTP 에 대한 내용을 참고해주세요.

magicalcode.tistory.com/74

 

연결이 잘 됐다면, InputStreamReader() 으로 데이터를 받을 수 있습니다.

그리고 BufferedReader() 를 통해 데이터를 꺼낼 수 있지요.

 

꺼낸 데이터는 runOnUiThread { } 를 통해 메인 스레드에 접근,

아래 결과처럼 View 에 데이터를 Set 해줄 수 있습니다.

 

이 포스팅은 <이것이 안드로이드다 with코틀린> by고돈호를 참고하여 작성했습니다.

 

 

 

지금은 OKHttp 또는 Retrofit 과 같은 더 빠르고 간단히 통신할 수 있는 라이브러리가 있기에 많이 사용되진 않습니다.

하지만 두 라이브러리 모두 HttpUrlConnection 기반인 통신이기 때문에 알고 있으면 좋을 것 같습니다.

감사합니다.

반응형