2

我正在尝试将 application/json 设置为喷雾路由参与者中的 content-Type。但是我在回复中看到的内容类型始终是文本/纯文本。我尝试使用喷雾路由方法(“something”)和喷雾罐方法(“something2”),但是这两个路由没有正确发送响应类型。我错过了什么?

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`
4

2 回答 2

1

实际上,有一个更好的方法来返回带有模块jsonapplication/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 方法末尾的数字等于案例类参数的数量。

于 2014-03-01T06:56:07.930 回答
1

似乎响应标头被字符串的编组器覆盖。

像这样它就像一个魅力:

path("something") {
  get {
    respondWithMediaType(`application/json`) {
      complete("""{ "key": "value" }""")
    }
  }
}
于 2014-02-28T10:12:48.107 回答