阅读量:2
在 Debian 上让 Swagger 支持多种数据格式
一 核心思路
- 在 OpenAPI/Swagger 规范中为同一路径的同一操作同时声明多个 media type(consumes/produces),并在请求体与响应体中分别用 schema 精确描述各格式的约束与示例。这样 Swagger UI 会在“Try it out”中提供格式切换,后端按 Content-Type 进行解析与序列化。
- 在 Debian 环境中,使用 Node.js + Express + swagger-jsdoc + swagger-ui-express 或 Python Flask + flasgger 等常见组合即可完成上述声明与集成,部署时可用 Docker 运行 Swagger UI 或将其嵌入业务服务。
二 规范层配置示例
- 同时支持 JSON 与 XML 的请求体与响应体,并为每种格式提供清晰的 schema 与示例:
openapi: 3.0.3
info:
title: Multi-Format API
version: 1.0.0
paths:
/echo:
post:
summary: Echo back the request body in the same format
description: |
Accepts **application/json** or **application/xml**.
Returns the same media type that was sent.
operationId: echo
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Message'
examples:
sample:
value:
text: Hello JSON
application/xml:
schema:
$ref: '#/components/schemas/MessageXml'
examples:
sample:
value: |-
Hello XML
responses:
'200':
description: Echoed content in the requested format
content:
application/json:
schema:
$ref: '#/components/schemas/Message'
application/xml:
schema:
$ref: '#/components/schemas/MessageXml'
components:
schemas:
Message:
type: object
required: [text]
properties:
text:
type: string
example: Hello JSON
MessageXml:
type: string
xml:
name: Message
example: "Hello XML "
- 要点
- 在请求体与响应体的 content 下分别为 application/json 与 application/xml 声明 schema 与 examples。
- 使用 oneOf/anyOf 可做联合类型,但 UI 交互会复杂;多数场景显式并列更清晰。
- 如需文件上传,可再增加 multipart/form-data 并在 schema 中使用 binary 或 string(format: binary)。
三 服务端实现要点
- 内容协商与解析
- 读取请求头 Content-Type,按媒体类型选择对应的解析器(如 JSON 解析器、XML 解析器)。
- 设置响应头 Content-Type 与客户端请求的 Accept 相匹配。
- 示例中间件思路(Node.js/Express)
app.use(express.json()); // application/json
app.use(express.text({ type: 'text/xml' })); // application/xml
app.use(express.urlencoded({ extended: true }));
app.post('/echo', (req, res) => {
const contentType = req.get('content-type') || '';
let body;
if (contentType.includes('application/json')) {
body = req.body; // 已是对象
} else if (contentType.includes('application/xml')) {
// 简单演示:将 XML 文本原样回显;生产可用 fast-xml-parser/xmldom 等解析为对象
body = { text: req.body };
} else {
return res.status(415).send('Unsupported Media Type');
}
// 回显相同格式
const accept = req.get('accept') || '';
if (accept.includes('application/xml')) {
res.type('application/xml').send(`${escapeXml(body.text)} `);
} else {
res.json(body);
}
});
- 框架生态
- Flask 可结合 flasgger 定义多 media type 的 operation 与 schema,并在视图中按 request.mimetype 分流处理与序列化。
- Spring Boot 项目可用 Swagger/OpenAPI 注解声明多 consumes/produces,由消息转换器完成实际解析与输出。
四 在 Debian 上的部署与验证
- 本地开发
- 安装 Node.js/npm,使用 swagger-jsdoc + swagger-ui-express 提供文档与调试界面;访问 /api-docs 即可在 Swagger UI 中切换 application/json 与 application/xml 测试。
- 容器化部署
- 使用官方镜像快速提供独立的 Swagger UI:
- 拉取并运行:
docker run -p 8080:8080 swaggerapi/swagger-ui - 将服务指向你的 openapi.yaml/swagger.json(通过环境变量或挂载卷配置),即可在 http://
:8080 浏览与调试多格式接口。
- 拉取并运行:
- 使用官方镜像快速提供独立的 Swagger UI:
以上就是关于“Debian Swagger如何支持多种数据格式”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm