从 Play 框架向 WS 客户端中的 WSRequest 添加 headers
Adding headers to WSRequest in WS client from Play Framework
我有一项服务需要通过 headers 进行身份验证。我有一个现有的 java 客户端,它为我生成值。我正在尝试使用 WSRequestHeaderFilter 将 headers 应用于 ws 请求。
当我设置断点时,代码似乎 运行 正常,我可以看到应用了 headers。但是在我的测试服务器(使用播放 SIRD 路由器)中 headers 似乎没有被应用?
如何使用过滤器或此类方法使我需要的 headers 出现在请求中?
查看下面的代码:
过滤器:
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
def getStuff() = ws.url(s"${baseUrl}/authenticatedEndpoint").withRequestFilter(filter).get()
测试:
// 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)所以如果你有类似的问题应该通过升级到 play 2.5.3(如果可用)
来解决
我有一项服务需要通过 headers 进行身份验证。我有一个现有的 java 客户端,它为我生成值。我正在尝试使用 WSRequestHeaderFilter 将 headers 应用于 ws 请求。
当我设置断点时,代码似乎 运行 正常,我可以看到应用了 headers。但是在我的测试服务器(使用播放 SIRD 路由器)中 headers 似乎没有被应用?
如何使用过滤器或此类方法使我需要的 headers 出现在请求中?
查看下面的代码:
过滤器:
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
def getStuff() = ws.url(s"${baseUrl}/authenticatedEndpoint").withRequestFilter(filter).get()
测试:
// 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)所以如果你有类似的问题应该通过升级到 play 2.5.3(如果可用)
来解决