设置Content-Type标头

时间:2018-07-17 10:53:47

标签: scala akka-http

我对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)
}

getAllEntitiesDB中的实体列表作为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())

1 个答案:

答案 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的情况下,无论如何这听起来都不是一个好主意。