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 № 1Wyglą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.