从 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(如果可用)

来解决