如何正确地将html文件作为正确的内容提供给带有akka-http的浏览器?

时间:2016-03-22 19:50:25

标签: scala akka akka-http

我正在查看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>"
    } 

1 个答案:

答案 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