由于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
。谢谢你的帮助。
答案 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。