网易首页 > 网易号 > 正文 申请入驻

适用于云的 Spring Boot:REST API 开发

0
分享至

每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。
概述在 Spring Cloud 应用程序上下文中特别重要的 Spring Boot 框架功能。在本文中,我们将讨论与 API 开发相关的功能。

微服务应用程序可以通过两种主要方式相互交互:REST 服务和消息系统。REST 方法是最常见的,将在本文中进行处理。我们将看到 Spring Boot 如何通过使用一组有用的注释和一些隐式后台行为(例如将 模型 对象序列化为 JSON 格式)使 REST API 的开发过程变得相当简单。
另一个重要问题与 API 的文档和共享有关,我们将看到这些问题通过名为Swagger的解决方案得到有效解决。将 Swagger 与Spring Boot集成使我们能够从源代码生成文档,作为 Swagger JSON 文件,甚至可以使用 Web 用户界面浏览和管理所有公开的 REST 服务。

REST API 开发
为了使用 Spring Boot 开发 REST API,我们需要在 Maven POM 中添加以下依赖项:


org.springframework.boot
spring-boot-starter-web

通过这种方式,我们将项目描述为一个 Web 应用程序,默认包含一个嵌入式 tomcat Web 服务器。然后,利用一组特定的注释,我们可以定义我们的控制器,这些控制器旨在向外部世界公开 HTTP REST 服务。我们可以通过简单地用@RestController 注释一个类来定义它们。接下来的步骤是设置定义实现我们服务的类方法与通过 HTTP 调用执行它们所需的 URI 路径之间的对应关系所需的映射。我们在以下代码片段中看到一个示例:
@RestController
@RequestMapping("/library")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping("/book")
public List findAll() {
return bookService.findAll();
}
@GetMapping("/book/{id}")
public Book findById(@PathVariable("id") String id) {
return bookService.findById(id);
}
@PostMapping("/book")
public Book add(@RequestBody Book book) {
return bookService.save(book);
}
@PutMapping("/book")
public Book update(@RequestBody Book book) {
return bookService.save(book);
}
@DeleteMapping("/book/{id}")
public void deleteByTitle(@PathVariable("id") String id) {
bookService.deleteById(id);
}
@GetMapping(value = "/book", params = {"author"})
public List findByAuthor(@RequestParam("author") String author) {
return bookService.findByAuthor(author);
}
}
这里我们用@RestController 和@RequestMapping("/library") 注释了一个类。@RequestMapping 注释为用于调用我们的服务的 HTTP 路径指定了一个前缀。然后为类公共方法配置其他注释,旨在实现 HTTP REST 经典调用:GET、POST、PUT、DELETE:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
这些注解包含 HTTP 路径的最后部分以及一个或多个参数(如有需要)。@PathVariable注解用于映射URI路径中直接传递的参数,并定义在相应方法注解中的花括号内。映射查询参数,也就是说,那些在“?”之后传递的参数 URI 中的字符,则可以使用 @RequestParameter 批注代替,如上面代码片段中的findByAuthor 方法。
例如,要获取数据库中的所有书籍,我们可以使用以下方法(如果应用程序正在我们的本地计算机上运行),并调用 HTTP GET 方法:
http://localhost:8080/library/book
要获得具有特定 ID 的图书:
http://localhost:8080/library/book/
或者最后得到作者的书籍列表(查询参数的情况)
http://localhost:8080/library/book?author=<作者姓名>
注释提供了一种简单的方法来“转换”一组服务中 Java 类的内部实现,这些服务可以通过 HTTP 协议从外部世界调用。另一个非常有用的特性是 JSON 数据的序列化。例如,如果我们考虑上面代码片段中名为add的 POST 方法,我们会看到它采用 Book 类型的参数。但我们知道对该方法的调用实际上是由带有 JSON 正文的 HTTP 调用进行的。Spring Boot 使用名为Jackson的库自动将该 JSON 转换为 Book 对象。
上述特性是促进微服务开发的良好基础。进一步的步骤是拥有一种有效的方式来共享和交流我们的 REST 服务的结构。在下一节中,我们将讨论这个问题,介绍一个名为Swagger的解决方案。
API 文档和 Swagger 解决方案
在微服务场景中开发一个完整的系统,其中有许多应用程序与 REST API 进行交互,需要保持所涉及的 API 的一致性。Swagger 是一个解决方案,包含许多工具来应对这些问题。Swagger通过 JSON 规范描述 API。我们可以用 JSON 格式定义我们的服务,然后从中生成基本代码,或者从我们的代码中生成 JSON。在此处描述的与 Spring Boot 的集成中,我们将使用第二个选项。
在上一节中,我们描述了如何使用一组给定的输入和输出对象映射和格式来开发由 Spring Boot 应用程序公开的 REST 服务。如果我们考虑大局,我们的单个应用程序必须与许多其他应用程序交互,这些应用程序可能由其他团队开发,它们有自己的 REST 接口,我们理解记录和传达这些接口的结构是多么重要。
在 Web 应用程序的上下文中将 Swagger 集成到 Spring Boot 中,我们可以生成 REST 服务的 JSON 描述,可通过特定的 URL 路径访问。我们还将有一个可用的 Swagger Web UI,允许我们浏览服务定义并与它们交互。
如何在 Spring Boot 中集成 Swagger
为了执行集成(我们在示例中使用 Swagger 2),我们要做的第一件事是设置相关的规范,如以下 Maven POM 片段所示:

io.springfox

springfox-swagger2

2.7.0

io.springfox

springfox-swagger-ui

2.7.0


然后我们必须通过 @EnableSwagger2注释启用 Swagger。在下面的代码片段示例中,我们在一个特定的配置类(用@Configuration 标记)中执行此操作,并且在同一个类中,我们定义了一个类型为Docket的 bean 。在Docket bean 配置中,我们设置了一个组名、一组基本信息(如标题、描述)和一个带有正则表达式的Predicate 对象,以捕获我们希望 Swagger 读取的 REST 服务可用的 URL 路径,在我们的示例中,所有路径都以“库”为前缀。
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket postsApi() {
return new Docket(DocumentationType.SWAGGER_2).groupName("mygroup")
.apiInfo(apiInfo()).select().paths( regex("/library/.*")).build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("REST API example")
.description("A minimal REST example with H2 in memory db as persistence layer")
.termsOfServiceUrl("http://codingstrain.com")
.license("REST API example License")
.licenseUrl("fake@gmail.com")
.version("1.0")
.build();
}
}
由于一个错误,我们还需要一个额外的配置,如下所示,假设我们使用的是 application.yaml 文件:

mvc:
pathmatch:
matching-strategy: ant_path_matcher

运行示例应用程序
您可以在以下 GitHub 链接中找到一个示例应用程序,其中包含前面部分中描述的所有配置:https ://github.com/mcasari/codingstrain.git 。您可以使用以下命令“git clone https://github.com/mcasari/codingstrain.git”将其安装为本地 git 存储库,并使用 Maven 从命令行或使用您喜欢的 IDE 编译和构建它。
您可以使用以下 Maven 命令“mvn spring-boot:run”运行它。由于它是一个 Spring Web 应用程序,它将与嵌入式 Web 服务器一起运行,默认情况下侦听8080端口。
我们可以使用 swagger 快速浏览甚至测试我们的 API。我们可以使用以下 URL 获取包含 API 定义的 JSON 文件:
http://localhost:8080/v2/api-docs?group=mygroup
从上面的 URL 可以看出,我们传递了一个名为group的查询参数,其值与我们在 Docket bean 配置中定义的组名称相对应。结果,我们获得了一个 JSON,它可以具有一些实用性,但不是我们所说的“用户友好”。作为更好的选择,我们可以通过以下地址使用 Swagger UI:
http://localhost:8080/swagger-ui.html
在下面的屏幕截图中,我们可以看到我们在屏幕上获得的内容。我们可以看到我们在应用程序中实现的所有 REST 服务,如果我们扩展它们,我们甚至可以与它们进行交互。例如,我们可以使用路径“/library/book”通过 HTTP POST 服务发布一本新书,或者使用以“ author” 为参数的可用 GET 方法获取作者的一本书。
招摇的用户界面
结论
在本文中,我们了解了 Spring Boot 如何简化 REST API 的开发。我们还看到集成像 Swagger 这样的解决方案如何改进服务定义的通信。这在微服务系统的上下文中尤为重要,在微服务系统中,我们有必须相互交互的独立应用程序,并且必须保持接口的一致性。
Spring Boot 还有另一个非常有用的功能,即所谓的Actuator依赖项,它提供了一组 HTTP 端点来监视、获取统计信息和管理生产环境中的应用程序。我们将在以下文章中介绍它:Spring Boot for Cloud - Actuator。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
女人G潮时,“喷”出的是水吗?

女人G潮时,“喷”出的是水吗?

水白头
2024-06-16 14:23:11
何谓“法律面前人人平等”?美国司法界判拜登儿子和特朗普都有罪

何谓“法律面前人人平等”?美国司法界判拜登儿子和特朗普都有罪

爆角追踪
2024-06-15 22:57:15
茅台的下跌,也许是贵州的麻烦才开始!

茅台的下跌,也许是贵州的麻烦才开始!

股海风云大作手
2024-06-16 15:33:25
活久见!广东一货车撞上复兴号,保险公司在角落瑟瑟发抖

活久见!广东一货车撞上复兴号,保险公司在角落瑟瑟发抖

起喜电影
2024-06-16 17:13:19
没有经过任何修复的一张毛主席照片,原汁原味的穿着就是这样

没有经过任何修复的一张毛主席照片,原汁原味的穿着就是这样

大江
2024-06-16 13:00:53
甘肃天水烟草局爆大狗,起早贪黑式造假揭秘!

甘肃天水烟草局爆大狗,起早贪黑式造假揭秘!

新动察
2024-06-16 11:36:42
女子找医生通奸,还借给医生90万,2009年被医生截肢成180块抛尸

女子找医生通奸,还借给医生90万,2009年被医生截肢成180块抛尸

汉史趣闻
2024-06-13 09:07:50
土地卖不动以后,为了保障体制内的工资,许多地方开始“大甩卖”

土地卖不动以后,为了保障体制内的工资,许多地方开始“大甩卖”

庞明说财经
2024-06-16 17:00:58
太突然了!山东菏泽曹县翰林府长达7分29秒视频,为何引发热搜?

太突然了!山东菏泽曹县翰林府长达7分29秒视频,为何引发热搜?

火山诗话
2024-06-16 16:42:18
全跑光了,一家7口套现20亿,把公司卖给了17万股民

全跑光了,一家7口套现20亿,把公司卖给了17万股民

灰鸽观察室
2024-06-15 20:09:36
首次!大批俄军被包围,“正处于投降的边缘”

首次!大批俄军被包围,“正处于投降的边缘”

近距离
2024-06-16 13:12:55
失望!瑞士和平峰会开幕,传言不参加的国家都来了

失望!瑞士和平峰会开幕,传言不参加的国家都来了

手工制作阿歼
2024-06-16 17:14:19
辛酸!队友绝杀之后拜合拉木迅速捡球 这次他没敢庆祝

辛酸!队友绝杀之后拜合拉木迅速捡球 这次他没敢庆祝

球事百科吖
2024-06-16 12:02:51
欧洲杯被中文广告包围?破案了:均为虚拟广告牌,与现场不一样!

欧洲杯被中文广告包围?破案了:均为虚拟广告牌,与现场不一样!

风过乡
2024-06-15 16:53:50
马来西亚总理不但看破,还非要说破:我不担心台海,原因很简单

马来西亚总理不但看破,还非要说破:我不担心台海,原因很简单

千里持剑
2024-06-16 12:42:12
6月16日俄乌最新:铁锅炖大鹅

6月16日俄乌最新:铁锅炖大鹅

西楼饮月
2024-06-16 16:13:50
网友:孙兴慜到底说了啥?王大雷调侃回复:他说他对不起中国人民

网友:孙兴慜到底说了啥?王大雷调侃回复:他说他对不起中国人民

直播吧
2024-06-16 12:48:07
姜萍圆梦大学不止职教高考,江苏教育主管部门回应

姜萍圆梦大学不止职教高考,江苏教育主管部门回应

齐鲁壹点
2024-06-16 14:58:15
一家三口因没系安全带遭交警殴打,71岁老人肋骨被打断,官方回应

一家三口因没系安全带遭交警殴打,71岁老人肋骨被打断,官方回应

洛洛女巫
2024-06-16 11:41:32
土耳其女排2-3中国女排,赛后主帅桑塔雷利说了几句肺腑之言

土耳其女排2-3中国女排,赛后主帅桑塔雷利说了几句肺腑之言

百里无心
2024-06-16 10:32:36
2024-06-16 20:10:44
墨谈科技
墨谈科技
业务数码玩家.无聊的博主
2991文章数 567关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

凯特王妃患癌后首次露面 小王子跳舞抢镜被姐姐制止

头条要闻

凯特王妃患癌后首次露面 小王子跳舞抢镜被姐姐制止

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

旅游
本地
数码
亲子
公开课

旅游要闻

@毕业生,江苏这些景区可享免票或优惠

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

数码要闻

高通骁龙独享!Intel、AMD新笔记本首发不支持Copilot+

亲子要闻

原来你是这样的爸爸!

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版