使用Spring Boot REST服务可以节省编写框架组件和样板代码的时间。
在此文中,我们将从头编写自己的Spring Boot REST 服务。当你希望专注于你的业务而不是花时间编写框架组件和样板代码,Spring Boot的自动配置带来很大的便利。
今天,我们将创建一个简单的RESTful服务。首先,让我们编写第一个Dog服务。创建Spring Boot项目的最快的方式就是使用Spring Initializr。
教程大纲:
-
创建一个Spring Boot项目
-
模拟数据来源
-
使用GET,POST,DELETE方法创建Dogs控制器。
-
查看Dogs服务的运行情况
注意:
-
使用模拟数据库代替真实的数据
-
这里有一篇关于 Spring REST 服务异常处理的文章
-
将单元测试排除在范围之外。(我们将在单独的教程中介绍REST服务的测试)。
1. 创建Spring Boot项目
让我们来编写基本的项目组件。
1.1 build.gradle
到目前为止,我们已经添加了spring-boot-starter-web—表示我们希望构建web应用程序—和Lombok依赖项。
Lombok 帮助您摆脱典型的样板式代码,我一直很喜欢使用它。我通常使用Lombok来避免编写构造函数、getter、setter等。访问Project Lombok以获得更多信息。
buildscript
{
ext
{
springBootVersion
=
'2.1.0.RELEASE'
}
repositories
{
mavenCentral
()
}
dependencies
{
classpath
(
"org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
)
}
}
apply plugin
:
'java'
apply plugin
:
'eclipse'
apply plugin
:
'org.springframework.boot'
apply plugin
:
'io.spring.dependency-management'
group
=
'com.amitph.spring'
version
=
'0.0.1-SNAPSHOT'
sourceCompatibility
=
1.8
repositories
{
mavenCentral
()
}
dependencies
{
implementation
(
'org.springframework.boot:spring-boot-starter-web'
)
compile
(
'org.projectlombok:lombok:1.18.4'
)
testImplementation
(
'org.springframework.boot:spring-boot-starter-test'
)
}
1.2 Application.java
这是我们的启动点t — Application.java 有void的main方法, 我们能通过它启动Spring Boot程序。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
此时,您已经启动并运行了Spring Boot应用程序。您可以通过像运行任何其他Java类一样运行Application.java来确认,并查看服务器是否启动并监听端口8080(可配置)。 .
2. 模拟数据提供商
首先,让我们在应用程序中启动并创建服务和数据层。如上所述,本教程中不会有实际的数据存储,但是我们将使用模拟数据提供程序,它将作为我们需要的数据存储。
2.1 MockDogProvider
模拟Dog的提供者有一个实例级预填充的Dog的列表。类中的各种CRUD方法实际上在Dogs列表上执行操作。
@Component
public class MockDogProvider {
private List<Dog> mockDogStore;
public MockDogProvider() {
mockDogStore = new ArrayList<>();
mockDogStore.add(Dog.of(1, "Benji", 10));
mockDogStore.add(Dog.of(2, "Baxter", 9));
mockDogStore.add(Dog.of(3, "Brinkley", 8));
mockDogStore.add(Dog.of(4, "Daisy", 10));
mockDogStore.add(Dog.of(5, "Cujo", 12));
}
public List<Dog> getDogs() {
return mockDogStore;
}
public Dog findDogById(long id) {
for (Dog dog : mockDogStore) {
if (dog.getId() == id) {
return dog;
}
}
return null;
}
public void add(DogDto dto) {
mockDogStore.add(Dog.of(dto.getId(), dto.getName(), dto.getAge()));
}
public void delete(long id) {
int idx = 0;
for (; idx < mockDogStore.size(); idx++) {
if (mockDogStore.get(idx).getId() == id) {
break;
}
}
mockDogStore.remove(idx);
}
}
2.2 DogsService
Dogs服务是web应用程序的一个常规服务层。它只是解耦了控制器和数据提供程序。因为不涉及业务逻辑,所以它只是将调用委托给数据提供程序。
3. 控制器
到这里我们快完成了。我们最终需要的是一个控制器,它处理REST调用并将其委托给服务。
-
@RestController
-
@RequestMapping("/dogs")
-
@RequiredArgsConstructor
-
@Setter
-
public class DogsController {
-
@Autowired private final DogsService service;
-
@GetMapping
-
public List<Dog> getDogs() {
-
return service.getDogs();
-
}
-
@PostMapping
-
public void postDogs(@RequestBody DogDto dto) {
-
service.add(dto);
-
}
-
@GetMapping("/{id}")
-
public Dog getById(@PathVariable(required = true) long id) {
-
return service.getDogById(id);
-
}
-
@DeleteMapping("/{id}")
-
public void delete(@PathVariable(required = true) long id) {
-
service.delete(id);
-
}
-
}
4. 启动应用程序
4.1 获取所有的Dogs
打开浏览器输入下面地址(GET)
-
http://localhost:8080/dogs
下面输出:
[
{
"id":1,
"name":"Benji",
"age":10
},
{
"id":2,
"name":"Baxter",
"age":9
},
{
"id":3,
"name":"Brinkley",
"age":8
},
{
"id":4,
"name":"Daisy",
"age":10
},
{
"id":5,
"name":"Cujo",
"age":12
}
]
4.2 根据ID获取Dog
让我们做一个GET请求:
http://localhost:8080/dogs/3
输出:
{
"id":3,
"name":"Brinkley",
"age":8
}
4.3 添加新的Dog
这是一个POST请求,我将使用curl进行调用。
curl -X POST \
http://localhost:8080/dogs \
-H 'Content-Type: application/json' \
-H 'Postman-Token: c6813aea-146c-49cd-9eba-1370aad4bff9' \
-H 'cache-control: no-cache' \
-d '{
"id": 6,
"name": "Hooch",
"age": 11
}'
再次执行GET /dogs之后,您将看到添加了一个新的dog。
4.4 删除一个 Dog
这是一个使用curl的删除请求.
curl -X DELETE \
http://localhost:8080/dogs/5 \
-H 'Content-Type: application/json' \
-H 'Postman-Token: b4b93304-7ee7-45c2-917b-c3bc2985a250' \
-H 'cache-control: no-cache
执行此之后,您应该看到id 为5的Dog从列表中删除了。