Akka Http - 如何从 HttpResponse headers 读取 Content-Disposition?

Akka Http - how to read Content-Disposition from HttpResponse headers?

我正在使用 Akka Http 下载文件,但无法从响应 header 中提取文件名。我的回复 header 看起来像这样:

Server: custom_server
Date: Sat, 8 Jul 2017 01:30:39 GMT
Connection: keep-alive
Pragma: public
Cache-Control: must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
content-disposition: attachment;filename*=UTF-8''my_custom_name.pdf
Strict-Transport-Security: max-age=15768000                  

当我尝试检查 content-disposition header 是否存在时,我总是收到 false:

val hasDispositionHeader = response.headers.exists {
  case headers.`Content-Disposition`(contentDisposition, params) => true
  case _ => false
}

也尝试使用 java api 但没有成功:

val fileName = response.header[ContentDisposition].get.value

我注意到 content-disposition header 键是小写的(这是一个我无法控制的远程服务器)- 知道如何处理它?

非常感谢您的帮助!

查看 http://doc.akka.io/docs/akka/2.4.11.1/scala/http/common/http-model.html#HttpResponse,我看到 response.headers 是一个 Seq,所以:

response.headers.find(_name.toLowerCase == "content-disposition")

您可以使用 lowercaseName:

val contentDispositionValue =
  response.headers
          .find(_.lowercaseName == "content-disposition")
          .map(_.value)

上面的 returns 一个包含整个 header 值的 Option[String]

要从 header 值中获取文件名 (my_custom_name.pdf),您必须自己提取它。如果你想避免使用正则表达式,正如你在评论中提到的,那么你可以 split '' 分隔符上的 String

val fileName =
  response.headers
          .find(_.lowercaseName == "content-disposition")
          .map(_.value)
          .map(_.split("''"))
          .collect { case Array(first, second) => second }

上面的returns一个只包含文件名的Option[String]。显然,这仅适用于示例中的特定 header 值格式(即,文件名是 header 值的最后一部分,并且紧接在 '' 之前,并且'' 在 header 值中只出现一次)。对于其他 header 值格式,您必须根据需要调整方法。