Scala akka http:如何设置响应头

Scala akka http:如何设置响应头,scala,routes,akka,spray,akka-http,Scala,Routes,Akka,Spray,Akka Http,我的路线如下: val route = { logRequestResult("user-service") { pathPrefix("user") { get { respondWithHeader(RawHeader("Content-Type", "application/json")) { parameters("firstName".?, "lastName".?).as(Name) { name =&g

我的路线如下:

val route = {
    logRequestResult("user-service") {
      pathPrefix("user") {
        get {
          respondWithHeader(RawHeader("Content-Type", "application/json")) {
            parameters("firstName".?, "lastName".?).as(Name) { name =>
              findUserByName(name) match {
                case Left(users) => complete(users)
                case Right(error) => complete(error)
              }
            }
          }
        } ~
          (put & entity(as[User])) { user =>
            complete(Created -> s"Hello ${user.firstName} ${user.lastName}")
          } ~
          (post & entity(as[User])) { user =>
            complete(s"Hello ${user.firstName} ${user.lastName}")
          } ~
          (delete & path(Segment)) { userId =>
            complete(s"Hello $userId")
          }
      }
    }
  }
我的响应的内容类型应该始终是
application/json
,正如我为
get
请求设置的那样。然而,我在测试中得到的是
text/plain
。如何在响应中正确设置内容类型

另一方面,akka http文档是我见过的最没有价值的垃圾之一。几乎所有到示例代码的链接都被破坏了,他们的解释仅仅说明了显而易见的问题。Javadoc没有代码示例,我在Github上找不到他们的代码库,所以从他们的单元测试中学习也是不可能的。

我发现了一篇帖子,上面写着“在spray/akka http中,一些头被特别处理过”。显然,内容类型就是其中之一,因此不能像上面的代码那样设置。必须创建一个具有所需内容类型和响应主体的
HttpEntity
。有了这些知识,当我按如下方式更改
get
指令时,它起了作用

import akka.http.scaladsl.model.HttpEntity
import akka.http.scaladsl.model.MediaTypes.`application/json`

get {
  parameters("firstName".?, "lastName".?).as(Name) { name =>
    findUserByName(name) match {
      case Left(users) => complete(users)
      case Right(error) => complete(error._1, HttpEntity(`application/json`, error._2))
    }
  }
}

我同意你对文件状态的看法。我要说的是,作为一个社区项目,个人可以主动帮助改进自己。@acjay个人只有在掌握了代码后才能做出贡献,而现有的、糟糕的文档严重阻碍了这一点。是的,人们可以随时查看源代码,但是,同样,这对初学者来说不是很费时,对于大多数问题来说也不必要。如果他们总是想让人们研究源代码,他们就不应该假装有任何文档。