将自定义标头设置为 websocket 请求 (ktor)

Posted

技术标签:

【中文标题】将自定义标头设置为 websocket 请求 (ktor)【英文标题】:Set custom headers to websocket request (ktor) 【发布时间】:2019-08-21 19:36:56 【问题描述】:

我正在从客户端建立一个 websocket 连接,如下所示:

val client = HttpClient(CIO).config 
    install(WebSockets)


client.webSocket(
        method = HttpMethod.Get,
        host = "127.0.0.1",
        port = 8080,
        path = "/api") 

    // Send and receive messages

我想做的是向这个请求添加 http 标头。

Ktor 有一个相当长的文档,但尽管如此,我还是无法找到如何做到这一点。

【问题讨论】:

【参考方案1】:

终于找到答案了:

client.webSocket(
        method = HttpMethod.Get,
        host = "127.0.0.1",
        port = 8080,
        path = "/api",
        request = 
            header("my_header", "my_header_value")
        
) 
    // more

如何找到这个?来自webSocket的签名:

suspend fun HttpClient.webSocket(
        method: HttpMethod = HttpMethod.Get,
        host: String = "localhost",
        port: Int = DEFAULT_PORT,
        path: String = "/",
        request: HttpRequestBuilder.() -> Unit = ,
        block: suspend DefaultClientWebSocketSession.() -> Unit
): Unit

这里的HttpRequestBuilder 听起来像是可以自定义请求的东西(确实有一些文档)。

签名意味着request 应该是一个作用域闭包,其中this 将是HttpRequestBuilder

然后这个闭包可以设置标题或更改其他内容。例如,HttpRequestBuilder.header

【讨论】:

以上是关于将自定义标头设置为 websocket 请求 (ktor)的主要内容,如果未能解决你的问题,请参考以下文章

C# 将自定义标头设置为 httpclient 会导致错误,因为标头名称被误用

如何将自定义 HTTP 标头注入 SuperAgent 发出的每个请求?

将自定义标头传递给 Select2 上的 Ajax 请求

如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?

如何在 Javascript 中为 websocket 的请求标头设置 cookie?

如何以角度将自定义标头添加到httpRequest