【问题标题】:How to convert from response 'set-cookie' header to request 'cookie' header in spray?如何在喷雾中从响应“set-cookie”标头转换为请求“cookie”标头?
【发布时间】:2026-02-16 00:00:01
【问题描述】:

我正在尝试使用spray-clientspray-httpx,但我无法弄清楚如何将“set-cookie”标头从HttpResponse 转换为我想要设置的“cookie”标头在HttpRequest

val responseSetCookieHeaders = response.headers filter { _.name == "Set-Cookie" }
...
val requestCookieHeader:HttpHeader = ???
...
addHeader(requestCookieHeader) ~> sendReceive ~> { response => ??? }

我确实看到了spray.http.HttpHeaders.Cookie,但我看不到从HttpHeader 的实例转换为HttpCookie 的方法...

【问题讨论】:

    标签: scala spray


    【解决方案1】:

    HttpHeaders.Cookie 是一个带有unapply 方法的案例类。所以你可以用一个简单的函数从响应中提取它:

    def getCookie(name: String): HttpHeader => Option[HttpCookie] = {
      case Cookie(cookies) => cookies.find(_.name == name)
    }
    

    这是一个更一般的情况,但我认为解决方案很明确。

    我会这样做:

    // some example response with cookie
    val httpResponse = HttpResponse(headers = List(`Set-Cookie`(HttpCookie("a", "b"))))
    
    // extracting HttpCookie
    val httpCookie: List[HttpCookie] = httpResponse.headers.collect { case `Set-Cookie`(hc) => hc }
    
    // adding to client pipeline
    val pipeline = addHeader(Cookie(httpCookie)) ~> sendReceive
    

    【讨论】:

    • 从我可以看到匹配应该在Set-Cookie: val responseSetCookieHeader:HttpHeader = ???; responseSetCookieHeader 匹配 { case HttpHeader.Set-Cookie(c) => println(c.content) }。谢谢你让我走上正轨!
    • 基本上,我最终做了: responseSetCookieHeaders map { case HttpHeaders.Set-Cookie(c) => s"${c.name}=${c.content}" } mkString "; " 如果您通过匹配“Set-Cookie”而不是“Cookie”来更新您的答案,我会接受它
    • 只需添加最后一行,展示如何从 List[HttpCookie] 转换为 HttpHeader:HttpHeaders.Cookie(httpCookie)
    最近更新 更多