ZIO Http
ZIO HTTP 是一个用于构建 http 应用的 scala 库。它由 ZIO 和 Netty 驱动,旨在成为使用惯用 Scala 编写高可扩展性和高性能 Web 应用的事实标准解决方案。
ZIO HTTP 的设计基于 HTTP as function 的理念,其中服务器和客户端都是从请求到响应的函数,重点关注类型安全、可组合性和可测试性。
ZIO HTTP 的一些关键特性包括:
ZIO Native:ZIO HTTP 构建于 ZIO 之上,ZIO 是 Scala 中一种类型安全、可组合且异步的效果系统。它继承了 ZIO 的所有优势,包括可测试性、可组合性和类型安全性。
Cloud-Native:ZIO HTTP 专为云原生环境设计,支持构建高度可扩展和高性能的网络应用程序。基于 ZIO 构建,它内置了对并发、并行性、资源管理、错误处理、结构化日志、配置管理和指标监控的支持。
Imperative and Declarative Endpoints:除了命令式 API 外,ZIO HTTP 还提供了一种用于定义 HTTP 端点的声明式 API。在使用命令式端点时,端点的形状和逻辑是一起定义的;而在使用声明式端点时,端点的描述与其逻辑是分离的。开发人员可以选择最适合其需求的风格。
Type-Driven API Design:除了支持声明式端点描述外,ZIO HTTP 还提供了一种类型驱动的 API 设计,利用 Scala 的类型系统在编译时确保正确性和安全性。因此,端点的实现会根据端点的描述进行类型检查。
Middleware Support:ZIO HTTP 提供中间件支持,以便将日志记录、指标、身份验证等横切关注点集成到您的服务中。
错误处理:内置了对 HTTP 层错误处理的支持,能够区分已处理和未处理的错误。
WebSockets:对 WebSockets 的内置支持允许使用 ZIO HTTP 创建实时应用程序。
Testkit:ZIO HTTP 提供了一流的测试工具,便于编写测试,而无需运行实时服务器实例。
互操作性:提供了与现有 Scala/Java 库的互操作性,通过导入阻塞和非阻塞操作,实现与 Scala/Java 生态系统功能的无缝集成。
JSON 和二进制编解码器:对 ZIO Schema 的内置支持实现了请求/响应主体的编码和解码,支持多种数据类型,包括 JSON、Protobuf、Avro 和 Thrift。
模板系统:内置的 DSL 便于使用 Scala 代码编写 HTML 模板。
OpenAPI 支持:内置支持为 HTTP 应用程序生成 OpenAPI 文档,反之,也可以从 OpenAPI 文档生成 HTTP 端点。
ZIO HTTP CLI:可以利用 ZIO CLI 和 ZIO HTTP 的强大功能,构建用于与 HTTP API 交互的命令行应用程序。
安装
通过 build.sbt 进行设置:
libraryDependencies += "dev.zio" %% "zio-http" % "3.3.2"
版本说明:
- 旧版库版本
1.x或2.x,其组织io.d11下的 ZIO HTTP 源自 Dream11,该组织于 2022 年将 ZIO HTTP 捐赠给 ZIO 组织。 - 较新的库版本,从 2023 年开始,源于 ZIO 组织 以
0.0.x起步,并于 2023 年 4 月达到1.0.0发布候选版本
入门
ZIO HTTP 提供了一个简单且富有表现力的 API,用于构建 HTTP 应用程序。它同时支持服务器端和客户端 API。让我们看看如何简单地构建一个问候服务器,并使用客户端 API 调用它。
问候服务器
以下示例演示了如何构建一个简单的问候服务器。它包含 2 个路由:一个位于根
路径,返回一个固定字符串;另一个位于路径 /greet,根据查询参数 name 返回问候消息。
import zio._
import zio.http._
object GreetingServer extends ZIOAppDefault {
val routes =
Routes(
Method.GET / Root -> handler(Response.text("Greetings at your service")),
Method.GET / "greet" -> handler { (req: Request) =>
val name = req.queryOrElse[String]("name", "World")
Response.text(s"Hello $name!")
}
)
def run = Server.serve(routes).provide(Server.default)
}
问候客户端
以下示例演示了如何使用 ZIO HTTP 客户端调用问候服务器:
import zio._
import zio.http._
object GreetingClient extends ZIOAppDefault {
val app =
for {
client <- ZIO.serviceWith[Client](_.host("localhost").port(8080))
request = Request.get("greet").addQueryParam("name", "John")
response <- client.batched(request)
_ <- response.body.asString.debug("Response")
} yield ()
def run = app.provide(Client.default)
}
文档
在 ZIO Http 主页] 上了解更多!
贡献
有关一般准则,请参阅 ZIO 贡献者指南。
行为准则
请参阅 行为准则