【问题标题】:Add a custom header to scala WebSocketRequest向 scala WebSocketRequest 添加自定义标头
【发布时间】:2017-06-08 12:18:48
【问题描述】:

我正在按照示例 here 在 Scala 中创建 websocket 客户端。我想在 websocket 请求中传递一个自定义标头。我通过扩展 HttpHeader 创建了一个 CustomHeader 类。

final class CustomHeader(headerName: String, headerValue: String) extends HttpHeader {
  override def name(): String = headerName

  override def value(): String = headerValue

  override def lowercaseName(): String = name.toLowerCase

  override def renderInRequests(): Boolean = true

  override def renderInResponses(): Boolean = true
}

然后在客户端,

val headers = Seq(new CustomHeader("X-Auth-Token", authToken))
val request = new WebSocketRequest(uri = "ws://localhost:9035", extraHeaders = headers)

当我运行activator compile 时,它会抛出以下错误:

type mismatch;
[error]  found   : Seq[com.apple.geo.neutron.services.notification.event.CustomHeader]
[error]  required: scala.collection.immutable.Seq[akka.http.scaladsl.model.HttpHeader]
[error] Error occurred in an application involving default arguments.
[error]     val request = new WebSocketRequest(uri = "ws://localhost:9035", extraHeaders = headers)

如何解决此错误,或向 websocket 请求添加自定义标头?

【问题讨论】:

    标签: scala


    【解决方案1】:

    Seq 这里不是不可变的Seq。尝试将headers 定义为:

    val headers = scala.collection.immutable.Seq(new CustomHeader("X-Auth-Token", authToken))
    

    【讨论】:

    • 虽然这个解决方案解决了这个特定的错误,但它导致了另一个编译错误:方法 render in trait Renderable of type [R <: akka.http.impl.util.rendering r .type>
    【解决方案2】:

    回答我自己的问题。感谢this 线程,我找到了一种添加自定义标题的工作方法。这是我所做的:

    final class CustomHeader(headerValue: String) extends ModeledCustomHeader[CustomHeader] {
        override val companion = CustomHeader
    
        override def value(): String = headerValue
    
        override def renderInRequests(): Boolean = true
    
        override def renderInResponses(): Boolean = true
    }
    
    object CustomHeader extends ModeledCustomHeaderCompanion[CustomHeader] {
        override val name = "X-Auth-Token"
    
        override def parse(value: String) = Try(new CustomHeader(value))
    }
    

    然后,websocket 请求被创建为:

    val headers = scala.collection.immutable.Seq(new CustomHeader(authToken))
    val request = new WebSocketRequest(uri = "ws://localhost:9035", extraHeaders = headers)
    

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 2019-02-19
      • 2012-11-15
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2021-03-09
      相关资源
      最近更新 更多