일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- PrototypePattern
- F
- 빌터패턴
- 프로토타입 패턴
- 함수형프로그래밍
- 팩토리 메소드
- Functional Programming
- Kotlin
- ㅓ
- Design Pattern
- ㅋㅁ
- designPattern
- 싱글톤
- 디자인패턴
- factory method
- 추상팩토리패턴
- 옵저버 패턴
- 추상 팩토리
- Singleton
- Abstract Factory
- a
- El
- r
- 디자인패턴 #
- builderPattern
- Observer Pattern
- 코틀린
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Ktor requests 본문
클라이언트를 설정한 후 HTTP 요청을 할 수 있습니다.
HTTP 요청을 하는 주된 방법은 URL을 매개변수로 받을 수 있는 request function 입니다.
함수 내에서 다양한 요청 매개변수를 구성할 수 있습니다.
- GET, POST, PUT, DELETE, HEAD, OPTION 또는 PATCH와 같은 HTTP 메서드 지정
- URL을 문자열로 지정하거나 URL 구성 요소(도메인, 경로, 쿼리 매개변수 등)를 별도로 구성합니다.
- header / cookies 추가한다.
- request 본문(예: 일반 텍스트, 데이터 개체 또는 양식 매개변수)을 설정
httpClient.request("www.naver.com"){
method= HttpMethod.Get
header{ ... }
cookie()
setBody()
}
Specify a request URL( 구체적 요청 URL 생성하기)
client.get {
url {
protocol = URLProtocol.HTTPS
host = "ktor.io"
path("docs/welcome.html")
}
}
HttpRequestBuilder에 url 사용됩니다. 이 매개변수는 URLBuilder를 허용하고 URL을 빌드할 때 더 많은 유연성을 제공.
* 모든 요청에 대한 Base URL을 구성하려면 DefaultRequest 플러그인을 사용
Path segments
appendPathSegments 기능을 사용하여 개별 경로 세그먼트를 전달할 수도 있습니다.
client.get("https://ktor.io") {
url {
appendPathSegments("docs", "welcome.html")
}
}
appendPathSegments는 경로 세그먼트를 인코딩합니다. 인코딩을 비활성화하려면 appendEncodedPathSegments를 사용
Query parameters
client.get("https://ktor.io") {
url {
parameters.append("token", "abc123")
}
}
URL fragment
해시 표시 #는 URL 마지막에 fragment 지정합니다.
client.get("https://ktor.io") {
url {
fragment = "some_anchor"
}
}
Set request parameters
HTTP 메서드, 헤더 및 쿠키를 비롯한 다양한 요청 매개변수를 지정하는 방법을 살펴봅니다.
특정 클라이언트의 모든 request 에 대해 일부 basic parms 를 구성해야 하는 경우 DefaultRequest 플러그인을 사용하십시오.
Headers
headers function 을 사용
client.get("https://ktor.io") {
headers {
append(HttpHeaders.Accept, "text/html")
append(HttpHeaders.Authorization, "abc123")
append(HttpHeaders.UserAgent, "ktor client")
}
}
Cookies
client.get("https://ktor.io") {
cookie(name = "user_name", value = "jetbrains", expires = GMTDate(
seconds = 0,
minutes = 0,
hours = 10,
dayOfMonth = 1,
month = Month.APRIL,
year = 2023
))
}
Ktor는 또한 호출 사이에 쿠키를 유지할 수 있는 HttpCookies 플러그인을 제공합니다.
플러그인을 설치하면 cookies function을 사용하여 추가된 쿠키는 무시됩니다.
Set request body
Request의 body을 설정하려면,
HttpRequestBuilder에서 제공하는 setBody 함수를 이용.
함수는 일반 텍스트, 임의의 클래스 인스턴스, 양식 데이터, 바이트 배열 등을 포함한 다양한 유형의 payload를 담을 수 있다..
Text
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
val response: HttpResponse = client.post("http://localhost:8080/post") {
setBody("Body content")
}
Objects
ContentNegotiation 플러그인을 사용하여 Serialize 도구를 설정하면 Request body 내의 클래스 인스턴스를 JSON으로 보낼 수 있다. 객체를 setBody 함수에 전달하고 contentType 함수를 사용하여 콘텐츠 유형을 application/json으로 설정
val response: HttpResponse = client.post("http://localhost:8080/customer") {
contentType(ContentType.Application.Json)
setBody(Customer(3, "Jet", "Brains"))
}
Form parameters
Ktor 클라이언트는 x-www-form-urlencoded 및 multipart/form-data 유형을 모두 사용하여 form parameters 를 보내기 위한 submitForm 기능을 제공합니다.
- formParameters Parameters.build를 사용하여 빌드된 form parameters 세트
val client = HttpClient(CIO)
val response: HttpResponse = client.submitForm(
url = "http://localhost:8080/signup",
formParameters = Parameters.build {
append("username", "JetBrains")
append("email", "example@jetbrains.com")
append("password", "foobar")
append("confirmation", "foobar")
}
)
Upload a file
- submitFormWithBinaryData 함수를 사용, 이 경우 boundary가 자동으로 생성됩니다.
val client = HttpClient(CIO)
val response: HttpResponse = client.submitFormWithBinaryData(
url = "http://localhost:8080/upload",
formData = formData {
append("description", "Ktor logo")
append("image", File("ktor_logo.png").readBytes(), Headers.build {
append(HttpHeaders.ContentType, "image/png")
append(HttpHeaders.ContentDisposition, "filename=\"ktor_logo.png\"")
})
}
)
- post 함수를 호출하고 MultiPartFormDataContent 인스턴스를 setBody 함수에 전달. MultiPartFormDataContent 생성자를 사용하여 boundary을 전달할 수도 있습니다.
val client = HttpClient(CIO)
val response: HttpResponse = client.post("http://localhost:8080/upload") {
setBody(MultiPartFormDataContent(
formData {
append("description", "Ktor logo")
append("image", File("ktor_logo.png").readBytes(), Headers.build {
append(HttpHeaders.ContentType, "image/png")
append(HttpHeaders.ContentDisposition, "filename=\"ktor_logo.png\"")
})
},
boundary = "WebAppBoundary"
)
)
onUpload { bytesSentTotal, contentLength ->
println("Sent $bytesSentTotal bytes from $contentLength")
}
}
* MultiPartFormDataContent를 사용하면 다음과 같이 경계 및 콘텐츠 유형을 재정의할 수 있다.
fun customMultiPartMixedDataContent(parts: List<PartData>): MultiPartFormDataContent {
val boundary = "WebAppBoundary"
val contentType = ContentType.MultiPart.Mixed.withParameter("boundary", boundary)
return MultiPartFormDataContent(parts, boundary, contentType)
}
Parallel requests(병렬 요청)
한 번에 두 개의 요청을 보낼 때 클라이언트는 첫 번째 요청이 완료될 때까지 두 번째 요청 실행을 일시 중단합니다
한 번에 여러 요청을 수행해야 하는 경우 coroutine launch 또는 asyn fun을 사용
아래 코드 스니펫은 두 요청을 비동기적으로 수행하는 방법을 보여줍니다.
runBlocking {
// Parallel requests
val firstRequest: Deferred<String> =
async { client.get("http://localhost:8080/path1").bodyAsText() }
val secondRequest: Deferred<String> =
async { client.get("http://localhost:8080/path2").bodyAsText() }
val firstRequestContent = firstRequest.await()
val secondRequestContent = secondRequest.await()
}
Cancel a request
요청을 취소해야 하는 경우 이 요청을 실행하는 코루틴을 취소할 수 있습니다.
launch 함수는 실행 중인 코루틴을 취소하는 데 사용할 수 있는 job 반환합니다.
import kotlinx.coroutines.*
val client = HttpClient(CIO)
val job = launch {
val requestContent: String = client.get("http://localhost:8080")
}
job.cancel()
'Ktor > Client' 카테고리의 다른 글
Ktor Retrying failed requests (0) | 2022.07.19 |
---|---|
Ktor User agent (0) | 2022.07.19 |
ktor(client Engines) (0) | 2022.07.15 |
Ktor(client) (0) | 2022.07.15 |
Ktor(Creating a client) (0) | 2022.07.13 |