Подтвердить что ты не робот

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, поэтому изучение их модульных тестов также не может быть и речи.

4b9b3361

Ответ 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))
    }
  }
}