setCookie方法指令
一个Route
只是:(RequestContext) => Future[RouteResult]
。因此,您可以使用函数组合将cookie添加到来自下游服务的HttpResponse
。
首先创建使用预定义流程的转发器:
val forwardRequest : HttpRequest => Future[HttpResponse] =
Source
.single(_)
.via(flow(server, port))
.runWith(Sink.head)
然后撰写该功能与getRequest
和转换器从HttpResponse
到RouteResult
:
val queryExternalService : Route =
getRequest andThen forwardRequest andThen (_ map RouteResult.Complete)
最后,设置cookie:
val httpCookie : HttpCookie = ??? //not specified in question
val myRoute : Route = setCookie(httpCookie)(queryExternalService)
手册附录中的路线
您可以手动设置Cookie:
val updateHeaders : (HttpHeader) => (HttpResponse) => HttpResponse =
(newHeader) =>
(httpResponse) =>
httpResponse withHeaders {
Some(httpResponse.headers.indexWhere(_.name equalsIgnoreCase newHeader.name))
.filter(_ >= 0)
.map(index => httpResponse.headers updated (index, newHeader))
.getOrElse(httpResponse.headers +: newHeader)
}
...
.runWith(Sink.head).flatMap { response =>
context complete updateHeaders(httpCookie)(response)
}
纯流量
你甚至可以完全避免使用路由传递一个Flow
到HttpExt#bindAndHandle
:
val myRoute : Flow[HttpRequest, HttpResponse, _] =
flow(server,port) map updateHeaders(httpCookie)
嗨,感谢您的帮助!在我的情况下,手动添加'Set-Cookie'头并不是那么容易,因为我不想替换现有的'Set-Cookie'数据,而只是添加我的cookie(我也想保留所有头文件)。不过,我用'RawHeader'手动执行它。 –
@JohnDoe欢迎您。快乐黑客... –