티스토리 뷰

반응형

Thread를 사용한 http 통신을 해서 서버에서 데이터를 가져오는 예제입니다.

자바에서 기본으로 제공되는 문법을 사용할 것입니다.

 

깃허브 api에서 데이터 가져오기

inner class GitHubThread : Thread() {

    override fun run() {
    
        val url = URL("https://api.github.com/zen")
        val connection = url.openConnection()

        val input = connection.getInputStream()
        val inputStreamReader = InputStreamReader(input, "UTF-8")
        val bufferReader = BufferedReader(inputStreamReader)

        var str: String? = null

        val stringBuffer = StringBuffer()

        do {
            str = bufferReader.readLine()

            if (str != null) {
                stringBuffer.append(str)
            }
        } while (str != null)

        val data = stringBuffer.toString()

        runOnUiThread {
            textView.text = data
        }
    }
}

 

val url = URL("https://api.github.com/zen")

주소를 관리하는 객체를 만들어서 담아줬습니다.

 

val connection = url.openConnection()

그리고 접속을 합니다.

 

 

문자열을 읽어오기 위해서 Stream을 사용하겠습니다.

val input = connection.getInputStream()
val inputStreamReader = InputStreamReader(input, "UTF-8")

 

val bufferReader = BufferedReader(inputStreamReader)

라인 단위로 읽어오기 위해서 BufferedReader을 사용하였습니다.

 

var str: String? = null

val stringBuffer = StringBuffer()

do {
    str = bufferReader.readLine()

    if (str != null) {
        stringBuffer.append(str)
    }
} while (str != null)

그리고 데이터를 읽어오고 읽어오면 StringBuffer에 저장하는 코드입니다.

 

 

실행을 하면 아래와 같이 동작합니다.

 

 

 

XML 데이터 사용하기

서버에서 받은 xml 데이터를 사용하도록 하겠습니다.

 

 

아래와 같은 xml에서 데이터를 추출하겠습니다.

<data>
    <item>
        <name>이름1</name>
        <age>나이1</age>
    </item>
    <item>
        <name>이름2</name>
        <age>나이2</age>
    </item>
</data>

 

 

아래는 전체 코드입니다.

 

val url = URL("링크")
val connection = url.openConnection()

val input = connection.getInputStream()

val factory = DocumentBuilderFactory.newInstance()
val builder = factory.newDocumentBuilder()
val document = builder.parse(input)

val root = document.documentElement

val itemList = root.getElementsByTagName("item")

for (i in 0 until itemList.length) {
    val itemElement = itemList.item(i) as Element

    val nameList = itemElement.getElementsByTagName("name")
    val ageList = itemElement.getElementsByTagName("age")

    val name = nameList.item(0) as Element
    val age = ageList.item(0) as Element
}

 

 

val factory = DocumentBuilderFactory.newInstance()
val builder = factory.newDocumentBuilder()
val document = builder.parse(input)

 xml 데이터를 가져오기 위해서는 DocumentBuilderFactory를 사용해야 됩니다.

 

val root = document.documentElement

<data></data>로 감싸진 전체 객체를 가져옵니다.

 

val itemList = root.getElementsByTagName("item")

그리고 원하는 tag의 list 값을 가져옵니다.

 

 

for (i in 0 until itemList.length) {

    val itemElement = itemList.item(i) as Element

    val nameList = itemElement.getElementsByTagName("name")
    val ageList = itemElement.getElementsByTagName("age")

    val name = nameList.item(0) as Element
    val age = ageList.item(0) as Element
}

그리고 list안에 tag 객체를 가져와서 내용을 추출하는 형식으로 되어있습니다.

 

 

 

JSON 데이터 사용하기

서버에서 받은 json 데이터를 사용하도록 하겠습니다.

 

데이터는 아래와 같습니다.

[
    {
        "name" : "ImLeaf"
        "age" : 19
    },
    {
        "name" : "Im-Tae"
        "age" : 7
    }
]

 

 

val url = URL("링크")
val connection = url.openConnection()

val input = connection.getInputStream()
val inputStreamReader = InputStreamReader(input)
val bufferReader = BufferedReader(inputStreamReader)

var str: String? = null

val stringBuffer = StringBuffer()

do {
    str = bufferReader.readLine()

    if (str != null) {
        stringBuffer.append(str)
    }
} while (str != null)

 

깃허브 api에서 데이터를 가져온 예제와 사용법은 같습니다.

 

하지만 데이터를 가져온 다음에 가공을 해줘야 됩니다.

 

val root = JSONArray(stringBuffer.toString())

for (i in 0 until root.length()) {

    val obj = root.getJSONObject(i)

    val name = obj.getString("name")
    val age = obj.getInt("age")
}

JSONArray와 getJSONObject를 통해 데이터를 가공해주면 됩니다.

반응형
댓글