使用 REST 访问 MongoDB 数据

时间:2022-12-23 16:56:00

使用 REST 访问 MongoDB 数据

本指南将引导您完成创建应用程序的过程,该应用程序通过基于超媒体休息的前端。

您将构建什么

您将构建一个 Spring 应用程序,该应用程序允许您创建和检索存储在​​Person​​蒙戈数据库通过使用Spring Data REST的NoSQL数据库。 Spring Data REST采用了以下特性:春天的哈特亚斯和春季数据 MongoDB并自动将它们组合在一起。

Spring Data REST 还支持春季数据 JPA,春天数据宝石火和弹簧数据 Neo4j作为后端数据存储,但这些不是本指南的一部分。

你需要什么

  • 约15分钟
  • 最喜欢的文本编辑器或 IDE
  • JDK 1.8或以后
  • 格拉德尔 4+​或梅文 3.2+
  • 您也可以将代码直接导入到 IDE 中:
  • 弹簧工具套件 (STS)
  • 智能理念
  • VSCode

如何完成本指南

像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。

要从头开始,请继续从 Spring 初始化开始.

要跳过基础知识,请执行以下操作:

  • 下载​并解压缩本指南的源存储库,或使用吉特:git clone https://github.com/spring-guides/gs-accessing-mongodb-data-rest.git
  • 光盘成gs-accessing-mongodb-data-rest/initial
  • 跳转到安装并启动 MongoDB.

完成后,您可以根据 中的代码检查结果。​​gs-accessing-mongodb-data-rest/complete​

从 Spring 初始化开始

你可以使用这个预初始化项目,然后单击生成以下载 ZIP 文件。此项目配置为适合本教程中的示例。

手动初始化项目:

  1. 导航到https://start.spring.io.此服务拉入应用程序所需的所有依赖项,并为您完成大部分设置。
  2. 选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。
  3. 单击依赖关系,然后选择休息存储库Spring Data MongoDB
  4. 单击生成
  5. 下载生成的 ZIP 文件,该文件是配置了您选择的 Web 应用程序的存档。

如果您的 IDE 集成了 Spring Initializr,则可以从 IDE 完成此过程。

您也可以从 Github 分叉项目,然后在 IDE 或其他编辑器中打开它。

安装并启动 MongoDB

要使本指南正常工作,您必须建立本地MongoDB服务器。

在安装了自制软件的 Mac OS X 计算机上,运行以下命令:

brew install mongodb

您可以在以下位置找到更多安装选项https://docs.mongodb.org/manual/installation/.

安装 MongoDB 后,您需要启动守护进程。在 Mac 上,您可以使用以下命令:​​mongo​

$ mongod
all output going to: /usr/local/var/log/mongodb/mongo.log

您可以通过运行命令从另一个终端窗口启动MongoDB客户端。​​mongo​

创建域对象

创建一个新的域对象来呈现人员,如以下示例(在 中)所示:​​src/main/java/com/example/accessingmongodbdatarest/Person.java​

package com.example.accessingmongodbdatarest;

import org.springframework.data.annotation.Id;

public class Person {

@Id private String id;

private String firstName;
private String lastName;

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}
}

对象具有名字和姓氏。(还有一个 ID 对象,它配置为自动生成,所以不需要处理它。​​Person​

创建个人存储库

接下来,您需要创建一个简单的存储库,如以下列表 (in ) 所示:​​src/main/java/com/example/accessingmongodbdatarest/PersonRepository.java​

package com.example.accessingmongodbdatarest;

import java.util.List;

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends MongoRepository<Person, String> {

List<Person> findByLastName(@Param("name") String name);

}

此存储库是一个接口,允许您执行涉及对象的各种操作。它通过扩展来获取这些操作,进而扩展​​Person​​​​MongoRepository​​PagingAndSortingRepositorySpring Data Commons 中定义的接口。

在运行时,Spring Data REST 会自动创建此接口的实现。然后它使用@RepositoryRestResource注释以指示 Spring MVC 在 创建 RESTful 端点。​​/people​

​@RepositoryRestResource​​​不是要导出的存储库所必需的。它仅用于更改导出详细信息,例如使用 而不是默认值 。​​/people​​​​/persons​

在这里,您还定义了一个自定义查询,以根据值检索对象列表。您可以在本指南中进一步了解如何调用它。​​Person​​​​lastName​

默认情况下,Spring Boot 会尝试连接到本地托管的 MongoDB 实例。阅读参考文档了解如何将应用程序指向托管在其他地方的 MongoDB 实例。

​@SpringBootApplication​​是一个方便的注释,它添加了以下所有内容:

  • ​@Configuration​​:将类标记为应用程序上下文的 Bean 定义源。
  • ​@EnableAutoConfiguration​​:告诉 Spring 引导根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果 在类路径上,则此注释会将应用程序标记为 Web 应用程序并激活关键行为,例如设置 .spring-webmvcDispatcherServlet
  • ​@ComponentScan​​:告诉 Spring 在包中查找其他组件、配置和服务,让它找到控制器。com/example

该方法使用 Spring Boot 的方法启动应用程序。您是否注意到没有一行 XML?也没有文件。此 Web 应用程序是 100% 纯 Java,您无需处理配置任何管道或基础结构。​​main()​​​​SpringApplication.run()​​​​web.xml​

构建可执行的 JAR

您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。

如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:​​./gradlew bootRun​​​​./gradlew build​

java -jar build/libs/gs-accessing-mongodb-data-rest-0.1.0.jar

如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:​​./mvnw spring-boot:run​​​​./mvnw clean package​

java -jar target/gs-accessing-mongodb-data-rest-0.1.0.jar

此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件.

将显示日志记录输出。该服务应在几秒钟内启动并运行。

测试应用程序

现在应用程序正在运行,您可以对其进行测试。您可以使用任何您想要的 REST 客户端。以下示例使用 *nix 工具 。​​curl​

首先,您希望查看*服务,如以下示例所示:

$ curl http://localhost:8080
{
"_links" : {
"people" : {
"href" : "http://localhost:8080/people{?page,size,sort}",
"templated" : true
}
}
}

前面的示例提供了此服务器必须提供的功能的第一瞥。有一个链接位于​​people​​​​http://localhost:8080/people​​.它有一些选项,例如、 和 。​​?page​​​​?size​​​​?sort​

Spring Data REST 使用HAL 格式用于 JSON 输出。它非常灵活,并提供了一种提供与所提供数据相邻的链接的便捷方法。

使用人员链接时,您会看到数据库中的记录(目前没有):​​Person​

$ curl http://localhost:8080/people
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/people{?page,size,sort}",
"templated" : true
},
"search" : {
"href" : "http://localhost:8080/people/search"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 0,
"number" : 0
}
}

目前没有元素,因此没有页面。是时候创建一个新的 !​​Person​

如果多次运行本指南,可能会有剩余数据。请参阅MongoDB shell 快速参考以获取命令,以便在需要重新启动时查找和删除数据库。

以下命令创建一个名为“Frodo Baggins”的人:

$ curl -i -X POST -H "Content-Type:application/json" -d "{  \"firstName\" : \"Frodo\",  \"lastName\" : \"Baggins\" }" http://localhost:8080/people
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Location: http://localhost:8080/people/53149b8e3004990b1af9f229
Content-Length: 0
Date: Mon, 03 Mar 2014 15:08:46 GMT
  • ​-i​​:确保您可以看到包含标头的响应消息。将显示新创建的 URI。Person
  • ​-X POST​​:表示此 a 用于创建新条目。POST
  • ​-H "Content-Type:application/json"​​:设置内容类型,以便应用程序知道有效负载包含 JSON 对象。
  • ​-d '{ "firstName" : "Frodo", "lastName" : "Baggins" }'​​:是否正在发送数据。

请注意上一个操作如何包含标头。这包含新创建的资源的 URI。Spring Data REST 还有两个方法( 和 ),您可以使用它们来配置框架以立即返回刚刚创建/更新的资源的表示形式。​​POST​​​​Location​​​​RepositoryRestConfiguration.setReturnBodyOnCreate(…)​​​​setReturnBodyOnUpdate(…)​

由此可以查询所有人,如以下示例所示:

$ curl http://localhost:8080/people
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/people{?page,size,sort}",
"templated" : true
},
"search" : {
"href" : "http://localhost:8080/people/search"
}
},
"_embedded" : {
"persons" : [ {
"firstName" : "Frodo",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/53149b8e3004990b1af9f229"
}
}
} ]
},
"page" : {
"size" : 20,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
}
}

该对象包含一个带有佛罗多的列表。请注意它如何包含一个链接。Spring Data REST 也使用​​persons​​​​self​​埃沃变形器将分组的实体名称复数化。

您可以直接查询单个记录,如以下示例所示:

$ curl http://localhost:8080/people/53149b8e3004990b1af9f229
{
"firstName" : "Frodo",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/53149b8e3004990b1af9f229"
}
}
}

这可能看起来纯粹是基于Web的,但是,在幕后,它正在与您启动的MongoDB数据库进行通信。

在本指南中,只有一个域对象。对于更复杂的系统,其中域对象彼此相关,Spring Data REST呈现其他链接以帮助导航到连接的记录。

查找所有自定义查询,如以下示例所示:

$ curl http://localhost:8080/people/search
{
"_links" : {
"findByLastName" : {
"href" : "http://localhost:8080/people/search/findByLastName{?name}",
"templated" : true
}
}
}

您可以看到查询的 URL,包括 HTTP 查询参数 。这与界面中嵌入的注释匹配。​​name​​​​@Param("name")​

若要使用该查询,请运行以下命令:​​findByLastName​

$ curl http://localhost:8080/people/search/findByLastName?name=Baggins
{
"_embedded" : {
"persons" : [ {
"firstName" : "Frodo",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/53149b8e3004990b1af9f229"
}
}
} ]
}
}

由于已将其定义为在代码中返回,因此它将返回所有结果。如果你已将其定义为仅返回,它将选取其中一个要返回的对象。由于这可能是不可预测的,因此您可能不希望对可以返回多个条目的查询执行此操作。​​List<Person>​​​​Person​​​​Person​

您还可以发出 、 和 REST 调用来分别替换、更新或删除现有记录。以下示例使用调用:​​PUT​​​​PATCH​​​​DELETE​​​​PUT​

$ curl -X PUT -H "Content-Type:application/json" -d "{ \"firstName\": \"Bilbo\", \"lastName\": \"Baggins\" }" http://localhost:8080/people/53149b8e3004990b1af9f229
$ curl http://localhost:8080/people/53149b8e3004990b1af9f229
{
"firstName" : "Bilbo",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/53149b8e3004990b1af9f229"
}
}
}

以下示例使用调用:​​PATCH​

$ curl -X PATCH -H "Content-Type:application/json" -d "{ \"firstName\": \"Bilbo Jr.\" }" http://localhost:8080/people/53149b8e3004990b1af9f229
$ curl http://localhost:8080/people/53149b8e3004990b1af9f229
{
"firstName" : "Bilbo Jr.",
"lastName" : "Baggins",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/53149b8e3004990b1af9f229"
}
}
}

​PUT​​​替换整个记录。未提供的字段将替换为 。您可以使用 更新项目的子集。​​null​​​​PATCH​

您还可以删除记录,如以下示例所示:

$ curl -X DELETE http://localhost:8080/people/53149b8e3004990b1af9f229
$ curl http://localhost:8080/people
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/people{?page,size,sort}",
"templated" : true
},
"search" : {
"href" : "http://localhost:8080/people/search"
}
},
"page" : {
"size" : 20,
"totalElements" : 0,
"totalPages" : 0,
"number" : 0
}
}

一个方便的方面超媒体驱动的界面是如何使用 curl(或任何您喜欢的 REST 客户端)发现所有 RESTful 端点。无需与客户交换正式合同或接口文档。

总结

祝贺!您刚刚开发了一个应用程序,其中包含基于超媒体REST前端和基于MongoDB的后端。