Spring开发系列教程(41)——集成Open API

Open API是一个标准,它的主要作用是描述REST API,既可以作为文档给开发者阅读,又可以让机器根据这个文档自动生成客户端代码等。

在Spring Boot应用中,假设我们编写了一堆REST API,如何添加Open API的支持?

我们只需要在pom.xml中加入以下依赖:

  • org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.0

然后呢?没有然后了,直接启动应用,打开浏览器输入ht tp://localhost:8080/swagger-ui.html

立刻可以看到自动生成的API文档,这里列出了3个API,来自api-controller(因为定义在ApiController这个类中),点击某个API还可以交互,即输入API参数,点"Try it out"按钮,获得运行结果。

是不是太方便了!

因为我们引入springdoc-openapi-ui这个依赖后,它自动引入Swagger UI用来创建API文档。可以给API加入一些描述信息,例如:

java 复制代码
@RestController
@RequestMapping("/api")
public class ApiController {
    ...
    @Operation(summary = "Get specific user object by it's id.")
	@GetMapping("/users/{id}")
	public User user(@Parameter(description = "id of the user.") @PathVariable("id") long id) {
		return userService.getUserById(id);
	}
    ...
}

@Operation可以对API进行描述,@Parameter可以对参数进行描述,它们的目的是用于生成API文档的描述信息。添加了描述的API文档如下:

大多数情况下,不需要任何配置,我们就直接得到了一个运行时动态生成的可交互的API文档,该API文档总是和代码保持同步,大大简化了文档的编写工作。

要自定义文档的样式、控制某些API显示等,请参考springdoc文档。

配置反向代理

如果在服务器上,用户访问的域名是ht tps://example.com,但内部是通过类似Nginx这样的反向代理访问实际的Spring Boot应用,比如ht tp://localhost:8080,这个时候,在页面ht tps://example.com/swagger-ui.html上,显示的URL仍然是ht tp://localhost:8080,这样一来,就无法直接在页面执行API,非常不方便。

这是因为Spring Boot内置的Tomcat默认获取的服务器名称是localhost,端口是实际监听端口,而不是对外暴露的域名和80443端口。要让Tomcat获取到对外暴露的域名等信息,必须在Nginx配置中传入必要的HTTP Header,常用的配置如下:

bash 复制代码
# Nginx配置
server {
    ...
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    ...
}

然后,在Spring Boot的application.yml中,加入如下配置:

bash 复制代码
server:
  # 实际监听端口:
  port: 8080
  # 从反向代理读取相关的HTTP Header:
  forward-headers-strategy: native

重启Spring Boot应用,即可在Swagger中显示正确的URL。

本文转载自廖雪峰老师的官方网站 liaoxuefeng.com

相关推荐
阳光宅男@李光熠3 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库
知识的搬运工旺仔3 小时前
唯一索引与 NULL 值:PostgreSQL 主键约束与 NULLS NOT DISTINCT
数据库·后端·sql·postgresql
张宜强3 小时前
025 安居租赁 · 房屋租赁平台
java·课程设计
Java_2017_csdn3 小时前
ReentrantLock 与 Redis RLock 对比解读
java
YDS8293 小时前
Small Spring IOC篇:实现 Bean 的定义、注册、获取
java·spring
大勇前进3 小时前
从 OC 到 Swift,老 iOS 开发者踩过的 10 个语法大坑
后端
边境悍匪3 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
我的xiaodoujiao3 小时前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django
烈风逍遥3 小时前
第五篇:通用 LLM 流式对话:前后端联接的完整实现
前端·后端·架构
需要8264 小时前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud