안녕하세요, 반갑습니다!
안드로이드는 데이터 통신을 위해서 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 에 대한 내용을 참고해주세요.
연결이 잘 됐다면, InputStreamReader() 으로 데이터를 받을 수 있습니다.
그리고 BufferedReader() 를 통해 데이터를 꺼낼 수 있지요.
꺼낸 데이터는 runOnUiThread { } 를 통해 메인 스레드에 접근,
아래 결과처럼 View 에 데이터를 Set 해줄 수 있습니다.
이 포스팅은 <이것이 안드로이드다 with코틀린> by고돈호를 참고하여 작성했습니다.
지금은 OKHttp 또는 Retrofit 과 같은 더 빠르고 간단히 통신할 수 있는 라이브러리가 있기에 많이 사용되진 않습니다.
하지만 두 라이브러리 모두 HttpUrlConnection 기반인 통신이기 때문에 알고 있으면 좋을 것 같습니다.
감사합니다.