9

我知道喷雾对我来说是这样做的,但我仍然想用我的标题覆盖它,我怎样才能覆盖响应中的标题?

我的回复如下所示:

case HttpRequest(GET, Uri.Path("/something"), _, _, _) =>
  sender ! HttpResponse(entity = """{ "key": "value" }""" // here i want to specify also response header i would like to explicitly set it and not get it implicitly
4

4 回答 4

14

如果您仍然想使用喷雾罐,那么您有两种选择,基于 HttpResponse 是一个案例类。第一种是传递具有显式内容类型的 List:

import spray.http.HttpHeaders._
import spray.http.ContentTypes._

def receive = {
    case HttpRequest(GET, Uri.Path("/something"), _, _, _) =>
      sender ! HttpResponse(entity = """{ "key": "value" }""", headers = List(`Content-Type`(`application/json`)))
  }

或者,第二种方法是使用方法withHeaders方法:

def receive = {
    case HttpRequest(GET, Uri.Path("/something"), _, _, _) =>
      val response: HttpResponse = HttpResponse(entity = """{ "key": "value" }""")
      sender ! response.withHeaders(List(`Content-Type`(`application/json`)))
  }

但是,就像jrudolph说的那样,使用喷雾路由要好得多,在这种情况下看起来会更好:

def receive = runRoute {
    path("/something") {
      get {
        respondWithHeader(`Content-Type`(`application/json`)) {
          complete("""{ "key": "value" }""")
        }
      }
    }
  }

但是喷雾使它变得更加容易并为您处理所有(非)编组:

import spray.httpx.SprayJsonSupport._
import spray.json.DefaultJsonProtocol._

def receive = runRoute {
  (path("/something") & get) {
    complete(Map("key" -> "value"))
  }
}

在这种情况下,响应类型将由application/json喷雾本身设置。

我的评论的完整示例:

class FullProfileServiceStack
  extends HttpServiceActor
     with ProfileServiceStack
     with ... {
  def actorRefFactory = context
  def receive = runRoute(serviceRoutes)
}

object Launcher extends App {
  import Settings.service._
  implicit val system = ActorSystem("Profile-Service")
  import system.log

  log.info("Starting service actor")
  val handler = system.actorOf(Props[FullProfileServiceStack], "ProfileActor")

  log.info("Starting Http connection")
  IO(Http) ! Http.Bind(handler, interface = host, port = port)
}
于 2013-10-16T06:52:58.283 回答
3

entity参数HttpResponse实际上是类型HttpEntity,并且您的字符串仅隐式转换为HttpEntity. 您可以使用其他构造函数之一来指定内容类型。在每晚版本的 spray 中查看可能的构造函数的源代码。

此外,如果您使用喷射路由,则可以将编组/解组留给基础设施。

于 2013-10-16T06:29:05.897 回答
2

在最新版本的 Spray (1.2.4 / 1.3.4) 中,您可能想要使用respondWithMediaType. 这是文档中的示例

val route =
  path("foo") {
    respondWithMediaType(`application/json`) {
      complete("[]") // marshalled to `text/plain` here
    }
  }

请注意,虽然这会覆盖 HTTP 标头值,但它不会覆盖用于将内容序列化到线路的编组器。

因此,使用最近的带有喷雾路由的喷雾,原始代码如下所示:

def receive = runRoute {
  path("/something") {
    get {
      respondWithMediaType(`application/json`) {
        complete("""{ "key": "value" }""")
      }
    }
  }
}
于 2016-10-18T19:34:27.550 回答
1

要添加到 4lex1v 的答案,GeoTrellis 网站上有一个非常好的、简短、简单、有效的教程(截至 4/15,scala 2.11.5),包括build.sbt. 对于这个堆栈溢出问题,GeoTrellis 片段也很容易消除。

http://geotrellis.io/tutorials/webservice/spray/

于 2015-04-03T23:27:29.960 回答