据我所知,喷雾为我做了这个,但是我仍然希望用我的标题覆盖它,如何覆盖响应中的标题?
我的回答如下:
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
答案 0 :(得分: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)
}
答案 1 :(得分:3)
entity
的{{1}}参数实际上是HttpResponse
类型,并且您的字符串仅隐式转换为HttpEntity
的实例。您可以使用其他构造函数之一来指定内容类型。有关夜间喷涂版本中可能的构造函数,请参阅the source。
此外,如果您使用喷涂路由,您可以将编组/解组留给基础架构。
答案 2 :(得分:2)
在最新版本的Spray(1.2.4 / 1.3.4)中,您可能希望使用respondWithMediaType
。这是the sample from the documentation:
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" }""")
}
}
}
}
答案 3 :(得分:1)
要添加到4lex1v的答案,GeoTrellis网站上有一个非常好,简短,简单,有效(截至4月15日,scala 2.11.5)的教程,包括build.sbt
。对于此堆栈溢出问题,GeoTrellis部分也很容易消除。