RESTHeart是一个基于 Java 的框架,它允许我们在MongoDB之上快速构建 HTTP API 。它使我们能够以最少的设置将 MongoDB 集合公开为 REST 和 GraphQL API,同时仍然允许我们根据需要进行控制。
在本教程中,我们将快速了解 RESTHeart API 框架。
什么是 RESTHeart?
RESTHeart 提供了一个基于 MongoDB 构建的开源 API 服务器。它会自动将我们的集合公开为 REST 和 GraphQL 端点,让我们无需编写任何代码即可创建 API。
开箱即用,我们得到:
- 通过 HTTP 和 GraphQL 提供全面的 CRUD 支持
- 基于角色的访问控制和身份验证
- 用于用户和角色管理的内置管理 API
- 通过 Java 插件或配置实现自定义行为的扩展点
运行 RESTHeart
如果我们想在本地运行 RESTHeart,我们需要安装 Java 21 或更高版本。此外,我们还需要下载RESTHeart 发行版。下载并解压后,我们可以通过运行restheart.jar立即启动该服务:
$ java -jar restheart.jar |
无需任何配置,这将尝试使用可在 127.0.0.1:27017 上访问且不需要任何凭据的 MongoDB。
或者,我们提供了一个 Docker 镜像,可用于运行 RESTHeart。这也使我们能够运行包含 MongoDB 的Docker Compose设置,以便所有组件都可以作为单个堆栈启动。为此,我们需要一个docker-compose.yml文件:
$ cat docker-compose.yml |
然后我们可以使用docker compose启动服务,然后就可以开始了:
$ docker compose up -d |
一旦一切开始,我们就可以通过调用服务器上的/ping端点来测试设置:
$ curl localhost:8080/ping |
至此,我们已经拥有了功能齐全的服务。
身份验证和用户
对我们的 RESTHeart 服务进行的大部分 API 调用都需要身份验证,RESTHeart 会自动处理。例如,如果我们向根资源发出未经身份验证的请求,则会收到 HTTP 401 Unauthorized响应:
$ curl -v localhost:8080/ |
默认情况下,所有用户记录都存储在 MongoDB 数据库的users集合中。如果我们在一个空数据库中启动 RESTHeart,则会自动创建该集合,并向其中添加一个管理员用户:
虽然密码已安全散列且无法查看,但默认凭据由用户名admin和密码secret组成。我们现在可以使用以下凭据再次发出请求:
$ curl -v -u admin:secret localhost:8080/ |
现在一切正常,我们得到了预期的响应。
使用 RESTHeart 进行 CRUD 操作
RESTHeart 自动从我们的数据库中公开 MongoDB 集合,以便我们可以通过标准 REST 和 GraphQL API 以最小的努力读取和操作它们。
1. REST API
RESTHeart 公开了一个 REST API,其中包含针对每个集合的一组标准 URL 模式:
- GET /
– 搜索集合 - GET /
/ – 从集合中获取记录 - POST /
– 在集合中创建新记录 - PUT /
/ – 替换集合中的一条记录 - PATCH /
/ – 修补集合中的记录 - DELETE /
/ – 从集合中删除一条记录 - GET /
$ curl -v -u admin:secret -X PUT localhost:8080/posts |
一旦我们有一个集合,我们就使用POST请求在其中创建一个新记录:
$ curl -v -u admin:secret -X POST localhost:8080/posts -d '{"title": "Introduction to RESTHeart", "author": "Baeldung"}' -H "Content-Type: application/json" |
这不会返回实际的记录,但它会给我们一个指向它的Location头。这也可以直接在数据库中看到:
然后我们可以使用GET请求并指定 ID来检索该记录:
$ curl -v -u admin:secret localhost:8080/posts/681a139012d5c00fcb674298 |
我们还可以通过对整个集合使用GET请求来选择整个集合:
$ curl -v -u admin:secret localhost:8080/posts |
正如预期的那样,我们还可以使用PUT、 PATCH和DELETE调用来更新和删除这些记录:
$ curl -v -u admin:secret -X PUT localhost:8080/posts/681a139012d5c00fcb674298 -H "Content-Type: application/json" -d '{"title": "Intro to RESTHeart", "author": "Baeldung"}' |
这些都不会返回结果,但如果我们再次查询,它会立即可用。
2. GraphQL API
除了 REST API 之外,RESTHeart 还允许我们通过 GraphQL API 公开数据。与 REST API 不同,这需要一些初始配置才能使一切正常工作。
所有 GraphQL API 都由gql-apps集合中的记录定义。因此,我们需要做的第一件事就是创建以下内容:
$ curl -v -u admin:secret -X PUT localhost:8080/gql-apps
然后,我们需要在此集合中创建一条包含 GraphQL API 定义的特殊记录。要创建一个公开我们一直在使用的 Posts 的 API,配置应如下所示:
$ cat posts.schema |
descriptor字段提供了 RESTHeart 用于管理 API 的一些定义。这里最重要的部分是uri字段,我们稍后会用到它。
这里的schema字段是我们 API 的完整 GraphQL Schema 定义,以GraphQL Schema 定义语言编写。
mappings字段告诉 RESTHeart 如何在 GraphQL API 和 MongoDB 集合之间进行映射。
在本例中,我们定义了一个包含name和author字段的Post类型,以及一个包含posts字段的Query类型,该字段映射到我们数据库中的posts集合。
然后我们按照与之前相同的方式创建此记录:
$ curl -v -u admin:secret -X POST localhost:8080/gql-apps -d "@posts.schema" -H "Content-Type: application/json" |
完成此操作后,我们的 GraphQL API 就可以使用了。我们将uri字段设置为restheart-posts,这意味着我们的 API 暴露在/graphql/restheart-posts上:
$ curl -v -u admin:secret -X POST localhost:8080/graphql/restheart-posts -d "{ posts { title author } }" -H "Content-Type: application/graphql" |
我们可以立即看到这是我们的 REST API 管理的相同数据。