오늘도 더 나은 코드를 작성하였습니까?

Ktor Receiving responses 본문

Ktor

Ktor Receiving responses

hik14 2022. 7. 20. 11:12

HTTP Request(request, get, post, etc.) 을 만드는 데 사용되는 모든 기능을 사용하면 HttpResponse 개체로 응답을 받을 수 있다.

 

HttpResponse는 다양한 방법(raw 바이트, JSON 객체 등)으로 Request Body을 가져오고,

status code, contents type, header 등과 같은 응답 매개변수를 가져오는 데 필요한 API를 이용한다.

 

val response: HttpResponse = client.get("https://ktor.io/docs/welcome.html")

Receive response body

Raw body

String으로 수신

val httpResponse: HttpResponse = client.get("https://ktor.io/")
val stringBody: String = httpResponse.body()

ByteArray로 수신

val httpResponse: HttpResponse = client.get("https://ktor.io/")
val byteArrayBody: ByteArray = httpResponse.body()

 

Request를 ByteArray로 가져와 파일에 저장하는 방법

val client = HttpClient()
val file = File.createTempFile("files", "index")

runBlocking {
    val httpResponse: HttpResponse = client.get("https://ktor.io/") {
        onDownload { bytesSentTotal, contentLength ->
            println("Received $bytesSentTotal bytes from $contentLength")
        }
    }
    val responseBody: ByteArray = httpResponse.body()
    file.writeBytes(responseBody)
    println("A file saved to ${file.path}")
}

JSON object

ContentNegotiation install 및 Serializer 의존성 추가

client 설정

       val client = httpClient {
                install(ContentNegotiation) {
                    json(Json {
                        prettyPrint = true // 출력옵션
                        isLenient = true // Json 큰따옴표 느슨하게 체크
                        ignoreUnknownKeys = true // 직렬화 불가능한 json 데이터 무시
                        coerceInputValues = true // "null" 이 들어간경우 default Argument 값으로 대체
                        serializersModule = XXXXSerializersModule // 직렬화 방식 설정.
                    })
                }
            }

Streaming data

HttpResponse.body 함수를 호출하여 body을 가져오면 Ktor는 메모리에서 응답을 처리하고 전체 응답 본문을 반환합니다. 

 

full response를 기다리는 대신 순차적으로 응답 청크를 가져와야 하는 경우,

scope가 지정된 execute{ ... }과 함께 HttpStatement를 사용합니다. 

val client = HttpClient(CIO)
val file = File.createTempFile("files", "index")

runBlocking {
    client.prepareGet("https://ktor.io/").execute { httpResponse ->
        val channel: ByteReadChannel = httpResponse.body()
        while (!channel.isClosedForRead) {
            val packet = channel.readRemaining(DEFAULT_BUFFER_SIZE.toLong())
            while (!packet.isEmpty) {
                val bytes = packet.readBytes()
                file.appendBytes(bytes)
                println("Received ${file.length()} bytes from ${httpResponse.contentLength()}")
            }
        }
        println("A file saved to ${file.path}")
    }
}

 * ByteReadChannel은 바이트 패킷(ByteReadPacket)을 사용하여 비동기적으로 데이터를 읽고 이러한 패킷의 내용을 파일의 내용에 추가하는 데 사용됩니다.

 

Receive response parameters

Status code

HttpResponse.status 이용.

import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*
import io.ktor.http.*

val httpResponse: HttpResponse = client.get("https://ktor.io/")
if (httpResponse.status.value in 200..299) {
    println("Successful response!")
}

Headers

HttpResponse.headers 속성을 사용하면 모든 응답 헤더가 포함된 헤더 맵을 가져올 수 있습니다. 

HttpResponse는 또한 특정 헤더 값을 수신하기 위한 함수들도 있다.

 

- Content-Type 헤더 값에 대한 contentType
- Content-Type 헤더 값의 charset에 대한 charset
- E-Tag 헤더 값에 대한 etag
- Set-Cookie 헤더 값에 대한 setCookie

'Ktor' 카테고리의 다른 글

Ktor Intercepting requests using HttpSend  (0) 2022.07.19
Ktor Default request  (0) 2022.07.19
Cookie  (0) 2022.07.19