/ / Spray 1.2 ignoruje nagłówek typu zawartości w odpowiedzi - spray, spray-dsl

Spray 1.2 ignoruje nagłówek typu zawartości w odpowiedzi - spray, spray-dsl

Próbuję ustawić application / json jakotreść - wpisz aktora do trasowania natryskowego. Ale typ zawartości widoczny w mojej odpowiedzi zawsze jest tekstem / zwykłym. Próbowałem użyć podejścia z rozpylaniem ("coś") i natryskiwania mogłem podejść ("coś2"), ale dwie trasy nie wysyłają poprawnie typu odpowiedzi Czy coś przeoczyłem?

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`

Odpowiedzi:

1 dla odpowiedzi № 1

Wygląda na to, że głowica reakcyjna została nadpisana przez marshaller na ciąg.

W ten sposób działa jak urok:

path("something") {
get {
respondWithMediaType(`application/json`) {
complete("""{ "key": "value" }""")
}
}
}

1 dla odpowiedzi nr 2

W rzeczywistości istnieje znacznie lepsze podejście do zwrotu json z a application/json typ zawartości z spray.json moduł. Jeśli masz właśnie key:value pary byłoby znacznie czystsze używać SprayJsonMarshaller, który automatycznie ustawi odpowiedni nagłówek. Rozważmy następujący przykład:

(get & path("somePath")) { complete(Map("key" -> "value")) }

Aby utworzyć odpowiedź json, wystarczy zaimportować dwie rzeczy:

import spray.json.DefaultJsonProtocol._ // contains default marshallers
import spray.httpx.SprayJsonSupport._   // will do all the headers work

Jeśli posiadasz własną klasę case, którą chciałbyś przesłać przez przewód, podaj konwerter do formatu json:

import spray.json.DefaultJsonProtocol._

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

Jest to o wiele lepsze podejście, jeśli później chciałbyś zmienić format odpowiedzi, wszystko co musisz zrobić, to zmienić koordynatora, przepisać kod.

liczba na końcu metody jsonFormat równa się liczbie argumentów klasy case.