【问题标题】:How to get raw value of `content-type` header in Akka Http?如何在 Akka Http 中获取“content-type”标头的原始值?
【发布时间】:2019-11-28 08:08:34
【问题描述】:

我正在从 Code Spray(版本:1.3.4)迁移到 akka-http(版本:10.0.13)。

我们有一个现有的客户,他们会发送Content-Type 比如application/vnd.awesome.value; mykey="custom/custom"

以下代码在 spray 中运行良好,但在 akka-http 中,参数 (mykey) 被剥离

request.header[`Content-Type`].map { header =>
  // HERE PARAMS IS EMPTY MAP
  val myKeyValue = header.contentType.mediaType.params.get("mykey").map(_.replace("\"", ""))
  myKeyValue.flatMap(_.toMediaType).getOrElse(header.contentType.mediaType)
}.getOrElse(defaultMediaType)

StringToMediaTypeConversion.scala

val customMediaTypes: List[MediaType] = ???
implicit class StringToMediaType(private val str: String) extends AnyVal {
  private def parseMediaType(input: String): Option[MediaType] = MediaType.parse(input).fold(_ => None, Some(_))
  private def isSupportedType(mediaType: MediaType): Boolean = customMediaTypes.contains(mediaType)
  private def extractMediaTypeParamIfExists(mediaType: MediaType): Option[MediaType] = mediaType.params.get("mykey") match {
    case Some(value) => parseMediaType(value)
    case None        => Some(mediaType)
  }

  def toMediaType: Option[MediaType] = parseMediaType(str).flatMap(extractMediaTypeParamIfExists).filter(isSupportedType)

}

以下单元测试正在通过

val customMediaType: Option[MediaType] = """application/vnd.awesome.value; mykey="custom/custom""""".toMediaType
customMediaType should not be None
customMediaType.get.mainType shouldBe "custom"
customMediaType.get.subType shouldBe "custom"

感谢任何帮助。

如何提取原始值?或如何提取媒体类型的参数值?

【问题讨论】:

  • 或许你需要headerValueByName
  • 我不能使用headerValueByName 指令,因为我必须从请求中提取多个标头并做一些按摩,所以在我的情况下,提取请求对象并做必要的事情是理想的,此外@987654333 @ header 不是普通的 header,因此它不适用于这种方法。 Content-Type 标头是 HttpEntity 的一部分

标签: scala akka-http spray


【解决方案1】:

我正在注册 documentation 中指定的自定义媒体类型,如果我删除它,我会看到预期的行为。

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2013-12-21
    • 2015-11-26
    相关资源
    最近更新 更多