doc-generate/OPENAPI3_GUIDE.md

280 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OpenAPI 3.0 使用指南
## 📚 概述
從 v1.1.0 開始,`go-doc` 支援生成 **Swagger 2.0****OpenAPI 3.0** 兩種規格。
## 🚀 快速開始
### 生成 Swagger 2.0(預設)
```bash
go-doc -a example/example.api -d output
```
### 生成 OpenAPI 3.0
```bash
go-doc -a example/example.api -d output -s openapi3.0
```
### 生成 OpenAPI 3.0 YAML
```bash
go-doc -a example/example.api -d output -s openapi3.0 -y
```
## 🔍 兩種規格的差異
### 1. 版本宣告
**Swagger 2.0:**
```json
{
"swagger": "2.0"
}
```
**OpenAPI 3.0:**
```json
{
"openapi": "3.0.3"
}
```
### 2. 伺服器定義
**Swagger 2.0:**
```json
{
"host": "example.com",
"basePath": "/v1",
"schemes": ["http", "https"]
}
```
**OpenAPI 3.0:**
```json
{
"servers": [
{"url": "http://example.com/v1"},
{"url": "https://example.com/v1"}
]
}
```
### 3. 資料模型定義
**Swagger 2.0:**
```json
{
"definitions": {
"User": {
"type": "object",
"properties": {...}
}
}
}
```
**OpenAPI 3.0:**
```json
{
"components": {
"schemas": {
"User": {
"type": "object",
"properties": {...}
}
}
}
}
```
### 4. 安全定義
**Swagger 2.0:**
```json
{
"securityDefinitions": {
"apiKey": {
"type": "apiKey",
"in": "header",
"name": "Authorization"
}
}
}
```
**OpenAPI 3.0:**
```json
{
"components": {
"securitySchemes": {
"apiKey": {
"type": "apiKey",
"in": "header",
"name": "Authorization"
}
}
}
}
```
### 5. 請求內容
**Swagger 2.0:**
```json
{
"parameters": [
{
"in": "body",
"name": "body",
"schema": {"$ref": "#/definitions/User"}
}
]
}
```
**OpenAPI 3.0:**
```json
{
"requestBody": {
"content": {
"application/json": {
"schema": {"$ref": "#/components/schemas/User"}
}
}
}
}
```
### 6. 回應內容
**Swagger 2.0:**
```json
{
"responses": {
"200": {
"description": "Success",
"schema": {"$ref": "#/definitions/User"}
}
}
}
```
**OpenAPI 3.0:**
```json
{
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {"$ref": "#/components/schemas/User"}
}
}
}
}
}
```
## 🎯 使用範例
### 完整範例:生成多種格式
```bash
# Swagger 2.0 JSON
go-doc -a example/example.api -d output -f api-swagger2
# Swagger 2.0 YAML
go-doc -a example/example.api -d output -f api-swagger2 -y
# OpenAPI 3.0 JSON
go-doc -a example/example.api -d output -f api-openapi3 -s openapi3.0
# OpenAPI 3.0 YAML
go-doc -a example/example.api -d output -f api-openapi3 -s openapi3.0 -y
```
### 使用 Makefile
```bash
# 生成所有範例(包含 Swagger 2.0 和 OpenAPI 3.0
make example
# 僅編譯
make build
# 測試
make test
```
## ⚙️ 轉換邏輯
`go-doc` 的內部轉換流程:
1. **解析 `.api` 檔案** → 使用 go-zero 的 API parser
2. **生成 Swagger 2.0 結構** → 基礎的 OpenAPI 2.0 規格
3. **轉換為 OpenAPI 3.0**(如果指定)→ 自動轉換:
- `definitions``components/schemas`
- `securityDefinitions``components/securitySchemes`
- `host/basePath/schemes``servers`
- body parameters → `requestBody`
4. **序列化輸出** → JSON 或 YAML 格式
## 🔧 技術細節
### 使用的函式庫
- **Swagger 2.0**: `github.com/go-openapi/spec`
- **OpenAPI 3.0**: `github.com/getkin/kin-openapi`
### 轉換函數
- `spec2Swagger()`: 將 go-zero API 轉為 Swagger 2.0
- `convertSwagger2ToOpenAPI3()`: 將 Swagger 2.0 轉為 OpenAPI 3.0
### 型別轉換
```go
// Swagger 2.0 Type
type: "string"
// OpenAPI 3.0 Type
type: &Types{"string"}
```
## 📖 參考資源
- [OpenAPI 3.0 Specification](https://spec.openapis.org/oas/v3.0.3)
- [Swagger 2.0 Specification](https://swagger.io/specification/v2/)
- [go-zero API 規範](https://go-zero.dev/docs/tutorials)
## ❓ 常見問題
### Q: 應該使用哪個版本?
**A:**
- **Swagger 2.0**: 如果需要與舊工具或系統相容
- **OpenAPI 3.0**: 推薦使用,功能更強大且為現代標準
### Q: 可以同時生成兩種格式嗎?
**A:** 可以!執行兩次命令即可:
```bash
go-doc -a api.api -d out -f api-v2
go-doc -a api.api -d out -f api-v3 -s openapi3.0
```
### Q: 轉換有什麼限制嗎?
**A:** 大部分功能都能完整轉換。唯一差異是:
- OpenAPI 3.0 的 server URLs 會根據 schemes 自動生成多個
- 某些 Swagger 2.0 特定的擴展可能不會轉換
### Q: 如何驗證生成的文檔?
**A:** 可以使用以下工具:
- **Swagger Editor**: https://editor.swagger.io/
- **Swagger UI**: 本地運行或線上版本
- **OpenAPI Generator**: 生成客戶端/伺服器代碼來驗證
## 🎉 總結
`go-doc` 現在支援:
- ✅ Swagger 2.0 (OpenAPI 2.0)
- ✅ OpenAPI 3.0
- ✅ JSON 和 YAML 輸出
- ✅ 自動轉換
- ✅ 完整的 go-zero API 特性支援
開始使用:
```bash
go-doc -a your-api.api -d output -s openapi3.0
```