无法使用 | 组合两个指令Akka-Http 上的运算符

Unable to combine two directives using the | operator on Akka-Http

我想从查询参数或授权中提取令牌 header。

为此,我创建了这个指令:

(parameter("token".optional) | optionalHeaderValueByName("Authorization")).flatMap { _ match {
    case Some(token) =>
      // authenticate it
      complete(...)
    case None =>
      reject(AuthenticationFailedRejection)
  }
}

问题是带有“令牌”查询参数的请求有效,但带有“授权”header(且没有查询参数)的请求无效。 optionalHeaderValueByName 被跳过。

相信是因为当parameter("token".optional)被拒绝时,它会自动returns一个401 Unauthorized回应。

如果确实如此,有没有办法让它也检查 optionalHeaderValueByName

我认为 | 运算符就是为此而设计的。

也许它在返回路线时有效?而不是 flatMapping?

这个post涵盖相同的use-case:

但由于某些原因,我无法复制它。

谢谢。

I believe it is because when parameter("token".optional) is rejected, it automatically returns a 401 Unauthorized response.

我认为恰恰相反。您将“token”参数设为可选,这意味着当它不存在时它仍然会被接受并且 | 之后的指令永远不会被评估。如果您删除 .optional 并且 token 参数不存在,它将被拒绝,并且将评估 | 之后的指令。