我对akka-http有问题。
Content-Type
标头的默认值为text/plain
。我正在尝试像这样设置application/json
的值:
val routes =
respondWithHeader(headers.`Content-Type`(ContentType(MediaTypes.`application/json`))) {
// ...
// all api routes
// ...
}
但这不起作用。 Content-Type
仍然是text/plain
。
UPD
我不正在阅读客户端Content-Type
标头。我正在尝试从服务器的默认Content-Type
标头发送另一个。
UPD2
例如:
import JsonProtocol.entityFormat
//...
(get & path("api" / "entities")) {
complete(getAllEntities)
}
getAllEntities
将DB
中的实体列表作为Future[Entity]
返回。
Entity
只是一个模型:
case class Entity(foo: Int, bar: String)
EntityFormat
如下:
object JsonProtocol extends spray.json.DefaultJsonProtocol {
implicit val entityFormat = jsonFormat2(Entity)
}
最后将Future
投射到ResponseMarshallable:
implicit def entity2ResponseMarshallable(entityF: Future[Entity]): ToResponseMarshallable =
entityF map (_.toJson.toString())
答案 0 :(得分:3)
将讨论中的讨论与实际解决方案放在一起:
如果您从.toString
方法中删除了entity2ResponseMarshallable
,那么只需
implicit def entity2ResponseMarshallable(
entityF: Future[Entity]): ToResponseMarshallable =
entityF map (_.toJson)
您应该在服务器响应中获得正确的内容类型标头。
这是akka-http想要处理Content-Type
标头的方式-它根据最终使用的编组器自动进行设置。您以前使用过的字符串会转换为text/plain
。
对于您的原始问题,我认为此时无法手动更改Content-Type
标头。按照Akka documentation
HTTP消息的Content-Type被建模为HttpEntity的contentType字段。因此,Content-Type标头不会出现在邮件的标头序列中。此外,显式添加到请求或响应的标头中的Content-Type标头实例将不会呈现到网络上,而是触发警告记录!
因此,要手动设置内容类型,必须按照我最初链接的另一个问题在HttpEntity
实例中覆盖它-为了在路由级别上进行操作在我不确定是否有可能重新定义HttpEntity
中包含的HttpResponse
的情况下,无论如何这听起来都不是一个好主意。