scala - 如何在 Akka Http 中以编程方式调用 Route
问题描述
在 Akka Http 中,可以通过这种方式定义路由系统来管理 REST 基础设施,如下所述:https ://doc.akka.io/docs/akka-http/current/routing-dsl/overview.html
val route =
get {
pathSingleSlash {
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`,"<html><body>Hello world!</body></html>"))
} ~
path("ping") {
complete("PONG!")
} ~
path("crash") {
sys.error("BOOM!")
}
}
有没有办法以类似于以下语句的方式以编程方式调用同一应用程序中的一个路由?
val response = (new Invoker(route = route, method = "GET", url = "/ping", body = null)).Invoke()
Response
远程 HTTP 调用服务的相同结果在哪里?
前面提到的 API 只是为了说明我的想法,我希望能够设置内容类型、标题等。
解决方案
最后,我通过在 Akka HTTP 文档中挖掘更多内容,设法找到了我自己问题的答案。
如此处所述:https://doc.akka.io/docs/akka-http/current/routing-dsl/routes.html,这Route
是一种定义如下:
type Route = RequestContext => Future[RouteResult]
RequestContext
的包装器在哪里HttpRequest
。但是,aRoute
可以隐式或不隐式地转换为其他函数类型也是如此,如下所示:
def asyncHandler(route: Route)(...): HttpRequest ⇒ Future[HttpResponse]
因此,确实可以通过将路由转换为另一种函数类型来“调用”路由,然后简单地传递一个HttpRequest
构建 ad hoc,接收包含所需响应的 Future。转换需要的时间比其他操作多一点,但这是可以在引导应用程序时完成的。
注意:转换需要这些导入,如此处所述:https ://doc.akka.io/docs/akka-http/current/introduction.html
implicit val system = ActorSystem("my-system")
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher
但是这些导入对于创建服务本身已经是强制性的。
推荐阅读
- r - 根据下一行条件删除R中的一行
- python-3.x - 为什么列表索引超出范围但似乎没问题
- python - 如何检测给定掩码的对象的像素位置 - OpenCV Python
- .net - Powershell和winapi SystemParametersInfo函数
- php - 为什么在匿名函数上使用 `unset` 时使用 `eval` 以后不会释放内存?
- python-3.x - 我怎么知道根 python 文件/模块运行是什么?
- spring-boot - java.lang.IllegalStateException:映射的不明确的处理程序方法
- sql - 通过一个简单的例子学习在 Firebird 中使用执行块
- android - 从房间数据库中获取当前月份
- powershell - Powershell - 用于服务启动和复制文件的数组循环