Spray 1.2 игнорирует заголовок типа содержимого в ответе
Я пытаюсь установить application/json как Content-Type в актере маршрутизации спрея. Но тип контента, который я вижу в своем ответе, всегда является текстовым / простым. Я попытался использовать подход с распылением ("что-то") и подход к аэрозольному баллону ("что-то2"), но эти два маршрута не отправляют тип ответа должным образом. Я что-то пропустил?
def receive = runRoute {
path("something") {
get {
respondWithHeader(`Content-Type`(`application/json`)) {
complete("""{ "key": "value" }""")
}
}
} ~
path("something2") {
get {
complete(HttpResponse(entity = """{ "key": "value" }""").withHeaders((List(`Content-Type`(`application/json`)))))
}
}
}`enter code here`
2 ответа
Кажется, что заголовок ответа перезаписывается маршаллером для строки.
Вот так это работает как шарм:
path("something") {
get {
respondWithMediaType(`application/json`) {
complete("""{ "key": "value" }""")
}
}
}
На самом деле, есть гораздо лучший подход, чтобы вернуть json
с application/json
тип содержимого с spray.json
модуль. Если у вас есть только key:value
парам было бы намного понятнее использовать SprayJsonMarshaller, который бы автоматически устанавливал соответствующий заголовок. Рассмотрим следующий пример:
(get & path("somePath")) { complete(Map("key" -> "value")) }
Чтобы сделать json-ответ, вам нужно импортировать две вещи:
import spray.json.DefaultJsonProtocol._ // contains default marshallers
import spray.httpx.SprayJsonSupport._ // will do all the headers work
Если у вас есть собственный класс дел, который вы хотите отправить по проводам, предоставьте конвертер в формат json:
import spray.json.DefaultJsonProtocol._
case class SomeClass(name: String)
object SomeClass {
implicit val someClassJson = jsonFormat1(SomeClass.apply)
}
Это гораздо лучший подход, потому что если вы позже захотите изменить формат ответа, все, что вам нужно сделать, это изменить маршаллера, переписать ваш код.
число в конце метода jsonFormat равно количеству аргументов класса case.