Spray 1.2忽略内容类型标头作为响应

时间:2014-02-28 09:18:02

标签: spray spray-dsl

我正在尝试将application / json设置为spray-Type中的content-Type。但我在回复中看到的内容类型总是文本/简单。我尝试使用喷雾路由方法(“某些东西”)和喷雾罐接近(“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`

2 个答案:

答案 0 :(得分:1)

似乎响应头已被字符串编组覆盖。

像这样,它就像一个魅力:

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

答案 1 :(得分:1)

实际上,有一种更好的方法可以返回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类参数的数量。