Spray 1.2 игнорирует заголовок типа контента в ответ

Я пытаюсь установить application/json как тип содержимого в актере маршрутизации спрея. Но тип контента, который я вижу в своем ответе, всегда текстовый/обычный. Я попытался использовать подход с маршрутизацией спрея («что-то») и подход с аэрозольным баллончиком («что-то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`

person Gevatter Tod    schedule 28.02.2014    source источник
comment
Я попытался использовать примеры кода из stackoverflow.com/questions/19396187/ но они не работают для меня   -  person Gevatter Tod    schedule 28.02.2014


Ответы (2)


Кажется, что заголовок ответа перезаписывается маршалером для строки.

Вот так это работает как шарм:

path("something") {
  get {
    respondWithMediaType(`application/json`) {
      complete("""{ "key": "value" }""")
    }
  }
}
person Gevatter Tod    schedule 28.02.2014

На самом деле, есть гораздо лучший способ вернуть 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

Если у вас есть собственный класс case, который вы хотите отправить по сети, предоставьте конвертер в формат json:

import spray.json.DefaultJsonProtocol._

case class SomeClass(name: String)
object SomeClass {
  implicit val someClassJson = jsonFormat1(SomeClass.apply)
}

Это гораздо лучший подход, потому что если вы позже захотите изменить формат в своем ответе, все, что вам нужно сделать, это изменить маршаллер, переписать свой код.

число в конце метода jsonFormat равно количеству аргументов класса case.

person 4lex1v    schedule 01.03.2014