2016-03-22 14 views
2

Akka-http belgelerine göz atıyorum ve HttpResponses kullanarak düşük düzey sunucu api ile html içeriğinin nasıl sunulacağını burada bulabilirsiniz. Ancak, tarayıcıda doğru bir şekilde gösterilmesi gereken html içeriğinin nasıl sunulacağına dair iyi bir örnek bulamıyorum. Bulduğum ve çalışabileceğim tek şey, aşağıda dize içeriğine hizmet vermesi. Bunun bir örneği bulundu:akka-http ile bir tarayıcıya doğru içerik olarak doğru bir html dosyasını nasıl sunabilirsiniz?

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) 

} 

burada ilgili bir soru Akka-http: Accept and Content-type handling

bulundu

imports akka.http.scaladsl.marshallers.xml.ScalaXmlSupport._ 

ama bu scaladsl marshallers içeren göremiyorum (Bu sıralanırken içerir) Tam anlamadım Bu bağlantıya cevap verin, ancak aşağıdakileri denedim (sonunda bunu işe aldım ..):

complete { 
    HttpResponse(entity=HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Say Hello</h1>")) 
} 

yanı sıra: muhtemelen bu işlemek için

complete { 
    respondWithHeader (RawHeader("Content-Type", "text/html(UFT-8")) 
     "<h1> Say hello</h1>" 
    } 
+0

her ikisi de şu anda olduğu gibi çalışmıyor. Mustafas öneri için bir xml kütüphanesi eklenmelidir ve kostya'nın önerisi için bir değer hatası almıyorum (ContentTypes.'text/html (UTF8) kullanıyorum) türünde bir uyumsuzluk alıyorum – stian

cevap

2

iyi yolu düzgün text/html gibi içerik türünü ayarlayacaktır bir NodeSeq Marshaller inşa etmek ScalaXmlSupport kullanmaktır. Bunu yapmak için öncelikle ScalaXmlSupport varsayılan olarak dahil edilmediğinden yeni bir bağımlılık eklemeniz gerekir. aşağıdaki gibi SBT kullandığınız varsayılarak, daha sonra eklemek bağımlılık geçerli:

"com.typesafe.akka" %% "akka-http-xml-experimental" % "2.4.2" 

Sonra kurulum yapabilirsiniz, akka içerik türünü belirler zaman text/html olarak işaretlenecektir bir Scala NodeSeq dönmek için şöyle bir rota:

text/html vs text/xml almak için
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 

hüner medya türü olarak MediaTypes.text/html ileterek ScalaXmlSupport üzerinde nodeSeqMarshaller yöntemi kullanmaktır. Yalnızca ScalaXmlSupport._'u içe aktarırsanız, kapsamda bulunan varsayılan marşal, içerik türünü text/xml olarak ayarlar.

+0

bu da işe yarar html bir dosyadan bir dize olarak okunduğunda? örneğin, val resp = Source.fromFile ("filePath"). mkString? – stian

+0

@stian, bu dize dosyadan okunan ek dizeyi eklediyseniz işe yarar. Önce bir NodeSeq. – cmbaxter

İlgili konular