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

Ktor requests 본문

Ktor/Client

Ktor requests

hik14 2022. 7. 19. 11:26

클라이언트를 설정한 후 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")
    }
}
 
trailingQuery 속성을 사용하여 쿼리 파라미터가 없더라도 ? 문자를 뒤에 붙혀 요청할 수 있다.

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