从播放框架向WS客户端中的WSRequest添加标头
问题描述:
我有一个需要通过标头验证的服务。我有一个现有的Java客户端为我生成值。我正在尝试使用WSRequestHeaderFilter将标头应用于ws请求。从播放框架向WS客户端中的WSRequest添加标头
代码似乎运行良好,当我断点,我可以看到头被应用。但在我的测试服务器(使用播放SIRD路由器)头似乎没有被应用?
如何使用过滤器或此类方法将请求的标题显示在请求中?
请参见下面的代码:
筛选:
//code omitted for brevity
def getStuff() = ws.url(s"${baseUrl}/authenticatedEndpoint").withRequestFilter(filter).get()
测试:在客户端
class AuthenticatingFilter @Inject() (authHeaderGenerator: AuthHeaderGenerator) extends WSRequestFilter {
def apply(executor: WSRequestExecutor): WSRequestExecutor = {
new WSRequestExecutor {
override def execute(request: WSRequest): Future[WSResponse] = {
val headers = authHeaderGenerator.generateRequestHeaders(request.method, request.uri.toString, null).asScala.toList
executor.execute(request.withHeaders(headers:_*))
}
}
}
}
使用
// code omitted for brevity
Server.withRouter() {
case GET(p"/authenticatedEndpoint") => Action {
request =>
request.headers.get(authHeader) match {
case Some(authHeaderValue) => Results.Ok(expectedResult)
case _ => Results.Forbidden
}
}
} {
implicit port =>
implicit val materializer = Play.current.materializer
WsTestClient.withClient {
client =>
val authenticatedClient: AuthenticatedClient = new AuthenticatedClient(client,filter)
val result: String = Await.result(authenticatedClient.getStuff(), Duration.Inf)
result must beEqualTo(expectedResult)
}
}
}
谢谢,
本
答
事实证明,这是一个错误发挥。我修补了这个,并且修改被合并到了主分支(https://github.com/playframework/playframework/pull/6077),所以如果你有类似的问题,这应该通过升级到2.5.3(当可用时)来修复。