6

akka-http 実験的な 1.0-M2 で遊んでいるときに、単純な Hello world の例を作成しようとしています。

import akka.actor.ActorSystem
import akka.http.Http
import akka.http.model.HttpResponse
import akka.http.server.Route
import akka.stream.FlowMaterializer
import akka.http.server.Directives._

object Server extends App {

  val host = "127.0.0.1"
  val port = "8080"

  implicit val system = ActorSystem("my-testing-system")
  implicit val fm = FlowMaterializer()

  val serverBinding = Http(system).bind(interface = host, port = port)
  serverBinding.connections.foreach { connection ⇒
    println("Accepted new connection from: " + connection.remoteAddress)
    connection handleWith Route.handlerFlow {
      path("") {
        get {
          complete(HttpResponse(entity = "Hello world?"))
        }
      }
    }
  }
}

コンパイルが失敗しますcould not find implicit value for parameter setup: akka.http.server.RoutingSetup

また、私が変われば

complete(HttpResponse(entity = "Hello world?"))

complete("Hello world?")

別のエラーが発生します:type mismatch; found : String("Hello world?") required: akka.http.marshalling.ToResponseMarshallable

4

2 に答える 2

7

調査により、問題が不足していることを理解することができましたExecution Context。両方の問題を解決するには、これを含める必要がありました:

implicit val executionContext = system.dispatcher

調べてみると、 a を返す必要があることがakka/http/marshalling/ToResponseMarshallable.scalaわかります。ToResponseMarshallable.applyFuture[HttpResponse]

また、 ではakka/http/server/RoutingSetup.scalaRoutingSetup.applyそれが必要です。

akka チームが@implicitNotFounds を追加する必要があるだけかもしれません。正確ではないが関連する答えを見つけることができました:Akka での Futures の直接使用とスプレー 1.2 にアップグレードした後の暗黙のスコープではない先物に対するスプレー マーシャラー

于 2015-01-14T11:12:27.163 に答える
2

よくわかりました - この問題は Akka HTTP 1.0-RC2 でまだ存在するため、そのためのコードは次のようになります (API の変更を考えると):

import akka.actor.ActorSystem
import akka.http.scaladsl.server._
import akka.http.scaladsl._
import akka.stream.ActorFlowMaterializer
import akka.stream.scaladsl.{Sink, Source}
import akka.http.scaladsl.model.HttpResponse
import Directives._
import scala.concurrent.Future

object BootWithRouting extends App {

  val host = "127.0.0.1"
  val port = 8080

  implicit val system = ActorSystem("my-testing-system")
  implicit val fm = ActorFlowMaterializer()
  implicit val executionContext = system.dispatcher

  val serverSource: Source[Http.IncomingConnection, Future[Http.ServerBinding]] =
    Http(system).bind(interface = host, port = port)

  serverSource.to(Sink.foreach {
    connection =>
      println("Accepted new connection from: " + connection.remoteAddress)
      connection handleWith Route.handlerFlow {
        path("") {
          get {
            complete(HttpResponse(entity = "Hello world?"))
          }
        }
      }
  }).run()
}
于 2015-05-07T10:17:47.447 に答える