从请求中提取Spray.io Content-Type?

时间:2013-05-06 20:55:45

标签: scala http-headers content-type spray

由于Spray.io是在低级别定义内容类型,我如何简单地引用传入请求的内容类型?

以下是图片为PUT的简短示例。

      put {
        entity(as[Array[Byte]]) { data =>
          complete{
            val guid = Image.getGuid(id)
            val fileExtension = // match a file extension to content-type here
            val key = "%s-%s.%s" format (id, guid, fileExtension )
            val o = new Image(key, contentType, data)
            Image.store(o)
            val m = Map("path" -> "/client/%s/img/%s.%s" format (id, guid, fileExtension))
            HttpResponse(OK, generate(m))
          }
        }
      }

鉴于上面的代码,提取内容类型的简单方法是什么?我可以简单地使用它来模式匹配到适当的fileExtension。谢谢你的帮助。

2 个答案:

答案 0 :(得分:7)

您可以构建自己的指令来提取内容类型:

val contentType = headerValuePF { case `Content-Type`(ct) => ct }

然后在你的路线中使用它:

  put {
    entity(as[Array[Byte]]) { data =>
      contentType { ct =>  // ct is instance of spray.http.ContentType
        // ...
      }
    }
  }

修改:如果您使用的是夜间版本,MediaTypes已包含文件扩展名,以便您可以使用其中的文件扩展名。在1.1-M7,您必须按照建议提供自己的映射。

答案 1 :(得分:3)

我认为您可以使用headerValue中的HeaderDirectives指令:

import spray.http.HttpHeaders._
headerValue(_ match {
   case `Content-Type`(ct) => Some(ct)
   case _ => None
}) { ct =>
   // ct has type ContentType
   // other routes here
}

这适用于Spray 1.0 / 1.1。