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.

Другие вопросы по тегам