我正在查看akka-http文档,并找到如何使用HttpResponses使用低级服务器api提供html内容。但是,我找不到任何关于如何提供html内容的好例子,这些内容应该在浏览器中正确表示。我发现并且能够正常工作的唯一事情就是它如下所示提供String内容。我找到了一个例子:
imports akka.http.scaladsl.marshallers.xml.ScalaXmlSupport._
但我看不出scaladsl包含marshallers(它包含编组)
import akka.http.scaladsl.Http
import akka.stream.ActorMaterializer
import akka.http.scaladsl.server.Directives._
import akka.actor.ActorSystem
object HttpAkka extends App{
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
implicit val ec = system.dispatcher
val route = get {
pathEndOrSingleSlash {
complete("<h1>Hello</h1>")
}
}
Http().bindAndHandle(route, "localhost", 8080)
}
在Akka-http: Accept and Content-type handling
找到相关问题我没有完全理解该链接中的答案,但尝试了以下内容(我最终得到了这个......):
complete {
HttpResponse(entity=HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Say Hello</h1>"))
}
以及:
complete {
respondWithHeader (RawHeader("Content-Type", "text/html(UFT-8"))
"<h1> Say hello</h1>"
}
答案 0 :(得分:2)
处理此问题的最佳方法可能是使用ScalaXmlSupport
构建NodeSeq
编组器,将内容类型正确设置为text/html
。为此,您首先需要添加新的依赖项,因为默认情况下不包括ScalaXmlSupport
。假设您正在使用sbt,那么要添加的依赖项如下:
"com.typesafe.akka" %% "akka-http-xml-experimental" % "2.4.2"
然后,您可以设置这样的路线,以便在akka设置内容类型时返回将被标记为NodeSeq
的Scala text/html
:
implicit val system = ActorSystem()
import system.dispatcher
implicit val mater = ActorMaterializer()
implicit val htmlMarshaller = ScalaXmlSupport.nodeSeqMarshaller(MediaTypes.`text/html` )
val route = {
(get & path("foo")){
val resp =
<html>
<body>
<h1>This is a test</h1>
</body>
</html>
complete(resp)
}
}
Http().bindAndHandle(route, "localhost", 8080
获取text/html
vs text/xml
的诀窍是在nodeSeqMarshaller
上使用ScalaXmlSupport
方法,传入MediaTypes.text/html
作为媒体类型。如果您只是导入ScalaXmlSupport._
,那么将在范围内的默认编组器会将内容类型设置为text/xml
。