5

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

4

2 回答 2

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 上,您必须按照您的建议提供自己的映射。

于 2013-05-07T09:54:25.323 回答
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
}

这适用于喷雾 1.0/1.1。

于 2013-05-07T06:40:03.647 回答