Akka-http: Как установить заголовки ответов
У меня есть маршрут следующим образом:
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, поэтому изучение их модульных тестов также не может быть и речи.
Ответы
Ответ 1
Я нашел этот один пост, в котором говорится: "В 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))
}
}
}