ITADN
zio/zio-http
zio/zio-http · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

ZIO Http

ZIO HTTP 是一个用于构建 http 应用的 scala 库。它由 ZIO 和 Netty 驱动,旨在成为使用惯用 Scala 编写高可扩展性和高性能 Web 应用的事实标准解决方案。

ZIO HTTP 的设计基于 HTTP as function 的理念,其中服务器和客户端都是从请求到响应的函数,重点关注类型安全、可组合性和可测试性。

Production Ready CI Badge Maven Central Version Maven metadata URL javadoc ZIO Http

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.x2.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 贡献者指南

行为准则

请参阅 行为准则

支持

Badge-Discord 与我们聊天。

许可证

许可证