我正在学习使用构建服务器Akka-Http,这是我到目前为止所写的
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._
import akka.stream.{Materializer, ActorMaterializer}
import spray.json.DefaultJsonProtocol
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
import scala.concurrent.ExecutionContextExecutor
// todo() : add event timestamp
case class ECFailure(symbolicName:String)
trait Protocols extends DefaultJsonProtocol {
implicit val ecFailureFormat = jsonFormat1(ECFailure.apply)
}
trait EmailService extends Protocols {
implicit val system: ActorSystem
implicit def executor: ExecutionContextExecutor
implicit val materializer: Materializer
val route =
logRequestResult("email-service") {
pathPrefix("ec") {
(post & entity(as[ECFailure])) { ecFailure =>
complete {
println("received: " + ecFailure)
"Done"
}
}
}
path("") { …Run Code Online (Sandbox Code Playgroud) 许多指令(例如,参数)提供了非常方便的解组机制。
但是我没能从文档中找到类似Path Matcher 的DSL 。我认为给定适当的解组器,我会像下面这样,
implicit val userStatusUnmarshaller: FromStringUnmarshaller[UserStatus] = ???
val route = path("user" / Segment.as[UserStatus]) { status: UserStatus =>
...
}
Run Code Online (Sandbox Code Playgroud)
特别是当自定义解组结果是枚举时。
他们是否提供了这样的方式,但我找不到或者是否有另一种方式可以做同样的事情?
我正在定义一些路径,但随后我在“pathPrefix(start)”之前遇到了波浪号 ~ 的这个错误。我对 Scala 有点陌生,所以有些东西不要马上点击。谢谢
not found:value ~
Run Code Online (Sandbox Code Playgroud)
是因为我需要定义一个函数吗?如果是为什么?
import
akka.http.scaladsl.marshallers.xml.ScalaXmlSupport.defaultNodeSeqMarshaller
import akka.http.scaladsl.server.{ HttpApp, Route }
import akka.http.scaladsl.model.StatusCodes
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import com.typesafe.config.ConfigFactory
import akka.event.Logging
import akka.http.scaladsl.model._
object ABC extends HttpApp with App {
implicit val actorSystem = ActorSystem()
implicit val matter = ActorMaterializer()
val start = "hello"
val Routing= {
path(start) {
redirect( Uri(start+ "/index.html"), StatusCodes.PermanentRedirect )
}
~
pathPrefix(start) {
content
}
}
val content =
{
get
{
path("html") {
getFromResource("src/html") }
}
}
}
Run Code Online (Sandbox Code Playgroud) 我是 Scala 的新手,我试图弄清楚如何添加到我们现有的路由中,以便如果遇到某个路径,我们会通过检查某些值是否存在以及它们是否存在来评估标头等于一些公认的值。如果成功,我们从头中取出一些 String 并将其传递,否则我们不应该继续路由并返回一些失败。
/abc -> don't check headers
/abc/def -> check headers, return
pathPrefix("abc") {
path("def") { // want to ADD something here to check headers and send it into someMethod
get {
complete(HttpEntity(something.someMethod(someValue)))
}
} ~ path("gdi") {
get { ... etc}
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法或虚拟示例都会非常有帮助。我在这里看到一些指令来从请求中获取内容和标题(https://doc.akka.io/docs/akka-http/10.0.11/scala/http/routing-dsl/directives/header-directives/ headerValue.html),但我不明白如何以这种方式链接指令。
如果我误解了什么,请帮助澄清!谢谢
我们正在使用 Kafka,并希望使用交互式查询来访问我们状态存储中的数据。我们有一个现有的服务,它使用 Akka HTTP 来提供 REST API,我们希望将交互式查询集成到流程中。
似乎kafka-streams-query非常适合这个。但是,它通过公开route使用低级 API的属性集成到 Akka HTTP 中,该属性映射到Flow[HttpRequest, HttpResponse, Any]. 我们之前的所有代码都使用 Akka HTTP 的路由 DSL 连接代码。
我希望像下面这样的代码可以工作,但它没有:
implicit val system:ActorSystem = ActorSystem("web")
implicit val materializer:ActorMaterializer = ActorMaterializer()
implicit val ec = system.dispatcher
val firstRoutes:Route = ... //a route object populated
val lastRoutes:Route = ... //other route object populad
val iqServiceFlow:Flow[HttpRequest, HttpResponse, Any] = ...// code that returns the interactive query service
val firstFlow = Route.handlerFlow(firstRoutes)
val lastFlow = …Run Code Online (Sandbox Code Playgroud) 在一个演示项目中,https://github.com/chbatey/akka-http-typed存在以下代码,它可以编译但我不明白表达式“Http()(untypedSystem).bindAndHandle(routes .userRoutes, "localhost", 8080)" 可以编译,因为 bindAndHandle 方法接受下面的参数(所以第一个应该是 Flow,但它是一个 Route,即 RequestContext ? Future[RouteResult] 函数类型)。
在另一个项目中,我得到了编译错误,我可以理解,因为实际参数的类型为Route,但第一个参数的声明类型为Flow。
请指教。
//def bindAndHandle(
// handler: Flow[HttpRequest, HttpResponse, Any],
// interface: String, port: Int = DefaultPortForProtocol,
// connectionContext: ConnectionContext = defaultServerHttpContext,
val serverBinding: Future[Http.ServerBinding] = Http()(untypedSystem).bindAndHandle(routes.userRoutes, "localhost", 8080)
//type of routes.userRoutes is Route
//where type Route = RequestContext ? Future[RouteResult]
//how can it be that this compiles? In another project it does not (which makes more sense to me)
Run Code Online (Sandbox Code Playgroud)