일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Functional Programming
- r
- factory method
- 프로토타입 패턴
- 디자인패턴 #
- designPattern
- El
- ㅓ
- 싱글톤
- 추상팩토리패턴
- 디자인패턴
- 함수형프로그래밍
- ㅋㅁ
- 옵저버 패턴
- 추상 팩토리
- F
- Abstract Factory
- PrototypePattern
- 팩토리 메소드
- builderPattern
- Observer Pattern
- Singleton
- 빌터패턴
- Kotlin
- Design Pattern
- a
- 코틀린
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Ktor Receiving responses 본문
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 |