624 lines
12 KiB
Markdown
624 lines
12 KiB
Markdown
|
|
---
|
||
|
|
name: api-documentation-generator
|
||
|
|
description: Generate OpenAPI/Swagger specifications and API documentation from code or design. Use when creating API docs, generating OpenAPI specs, or documenting REST APIs.
|
||
|
|
---
|
||
|
|
|
||
|
|
# API Documentation Generator
|
||
|
|
|
||
|
|
Generate OpenAPI/Swagger specifications and comprehensive API documentation.
|
||
|
|
|
||
|
|
## Quick Start
|
||
|
|
|
||
|
|
Create OpenAPI 3.0 specs with paths, schemas, and examples for complete API documentation.
|
||
|
|
|
||
|
|
## Instructions
|
||
|
|
|
||
|
|
### OpenAPI 3.0 Structure
|
||
|
|
|
||
|
|
**Basic structure:**
|
||
|
|
```yaml
|
||
|
|
openapi: 3.0.0
|
||
|
|
info:
|
||
|
|
title: API Name
|
||
|
|
version: 1.0.0
|
||
|
|
description: API description
|
||
|
|
servers:
|
||
|
|
- url: https://api.example.com/v1
|
||
|
|
paths:
|
||
|
|
/users:
|
||
|
|
get:
|
||
|
|
summary: List users
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Success
|
||
|
|
components:
|
||
|
|
schemas:
|
||
|
|
User:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
name:
|
||
|
|
type: string
|
||
|
|
```
|
||
|
|
|
||
|
|
### Info Section
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
info:
|
||
|
|
title: E-commerce API
|
||
|
|
version: 1.0.0
|
||
|
|
description: |
|
||
|
|
REST API for e-commerce platform.
|
||
|
|
|
||
|
|
## Authentication
|
||
|
|
Use Bearer token in Authorization header.
|
||
|
|
|
||
|
|
## Rate Limiting
|
||
|
|
1000 requests per hour per API key.
|
||
|
|
contact:
|
||
|
|
name: API Support
|
||
|
|
email: api@example.com
|
||
|
|
url: https://example.com/support
|
||
|
|
license:
|
||
|
|
name: MIT
|
||
|
|
url: https://opensource.org/licenses/MIT
|
||
|
|
```
|
||
|
|
|
||
|
|
### Servers
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
servers:
|
||
|
|
- url: https://api.example.com/v1
|
||
|
|
description: Production
|
||
|
|
- url: https://staging-api.example.com/v1
|
||
|
|
description: Staging
|
||
|
|
- url: http://localhost:3000/v1
|
||
|
|
description: Development
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paths and Operations
|
||
|
|
|
||
|
|
**GET endpoint:**
|
||
|
|
```yaml
|
||
|
|
paths:
|
||
|
|
/users:
|
||
|
|
get:
|
||
|
|
summary: List users
|
||
|
|
description: Retrieve a paginated list of users
|
||
|
|
tags:
|
||
|
|
- Users
|
||
|
|
parameters:
|
||
|
|
- name: page
|
||
|
|
in: query
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
default: 1
|
||
|
|
- name: per_page
|
||
|
|
in: query
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
default: 20
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Successful response
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: '#/components/schemas/User'
|
||
|
|
meta:
|
||
|
|
$ref: '#/components/schemas/PaginationMeta'
|
||
|
|
```
|
||
|
|
|
||
|
|
**POST endpoint:**
|
||
|
|
```yaml
|
||
|
|
/users:
|
||
|
|
post:
|
||
|
|
summary: Create user
|
||
|
|
tags:
|
||
|
|
- Users
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/CreateUserRequest'
|
||
|
|
example:
|
||
|
|
name: John Doe
|
||
|
|
email: john@example.com
|
||
|
|
responses:
|
||
|
|
'201':
|
||
|
|
description: User created
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/User'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
```
|
||
|
|
|
||
|
|
**Path parameters:**
|
||
|
|
```yaml
|
||
|
|
/users/{id}:
|
||
|
|
get:
|
||
|
|
summary: Get user by ID
|
||
|
|
parameters:
|
||
|
|
- name: id
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
description: User ID
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Success
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/User'
|
||
|
|
'404':
|
||
|
|
$ref: '#/components/responses/NotFound'
|
||
|
|
```
|
||
|
|
|
||
|
|
### Components - Schemas
|
||
|
|
|
||
|
|
**Simple schema:**
|
||
|
|
```yaml
|
||
|
|
components:
|
||
|
|
schemas:
|
||
|
|
User:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- id
|
||
|
|
- email
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
example: 1
|
||
|
|
name:
|
||
|
|
type: string
|
||
|
|
example: John Doe
|
||
|
|
email:
|
||
|
|
type: string
|
||
|
|
format: email
|
||
|
|
example: john@example.com
|
||
|
|
created_at:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
```
|
||
|
|
|
||
|
|
**Nested schema:**
|
||
|
|
```yaml
|
||
|
|
Order:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
customer:
|
||
|
|
$ref: '#/components/schemas/User'
|
||
|
|
items:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: '#/components/schemas/OrderItem'
|
||
|
|
total:
|
||
|
|
type: number
|
||
|
|
format: float
|
||
|
|
```
|
||
|
|
|
||
|
|
**Enum:**
|
||
|
|
```yaml
|
||
|
|
OrderStatus:
|
||
|
|
type: string
|
||
|
|
enum:
|
||
|
|
- pending
|
||
|
|
- processing
|
||
|
|
- shipped
|
||
|
|
- delivered
|
||
|
|
- cancelled
|
||
|
|
```
|
||
|
|
|
||
|
|
**OneOf (union types):**
|
||
|
|
```yaml
|
||
|
|
Payment:
|
||
|
|
oneOf:
|
||
|
|
- $ref: '#/components/schemas/CreditCardPayment'
|
||
|
|
- $ref: '#/components/schemas/PayPalPayment'
|
||
|
|
discriminator:
|
||
|
|
propertyName: payment_type
|
||
|
|
```
|
||
|
|
|
||
|
|
### Components - Responses
|
||
|
|
|
||
|
|
**Reusable responses:**
|
||
|
|
```yaml
|
||
|
|
components:
|
||
|
|
responses:
|
||
|
|
NotFound:
|
||
|
|
description: Resource not found
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/Error'
|
||
|
|
example:
|
||
|
|
error:
|
||
|
|
code: NOT_FOUND
|
||
|
|
message: Resource not found
|
||
|
|
|
||
|
|
BadRequest:
|
||
|
|
description: Invalid request
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/ValidationError'
|
||
|
|
|
||
|
|
Unauthorized:
|
||
|
|
description: Authentication required
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/Error'
|
||
|
|
```
|
||
|
|
|
||
|
|
### Components - Parameters
|
||
|
|
|
||
|
|
**Reusable parameters:**
|
||
|
|
```yaml
|
||
|
|
components:
|
||
|
|
parameters:
|
||
|
|
PageParam:
|
||
|
|
name: page
|
||
|
|
in: query
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
default: 1
|
||
|
|
|
||
|
|
LimitParam:
|
||
|
|
name: limit
|
||
|
|
in: query
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
default: 20
|
||
|
|
maximum: 100
|
||
|
|
|
||
|
|
IdParam:
|
||
|
|
name: id
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
```
|
||
|
|
|
||
|
|
### Security Schemes
|
||
|
|
|
||
|
|
**Bearer token:**
|
||
|
|
```yaml
|
||
|
|
components:
|
||
|
|
securitySchemes:
|
||
|
|
BearerAuth:
|
||
|
|
type: http
|
||
|
|
scheme: bearer
|
||
|
|
bearerFormat: JWT
|
||
|
|
|
||
|
|
security:
|
||
|
|
- BearerAuth: []
|
||
|
|
```
|
||
|
|
|
||
|
|
**API Key:**
|
||
|
|
```yaml
|
||
|
|
components:
|
||
|
|
securitySchemes:
|
||
|
|
ApiKeyAuth:
|
||
|
|
type: apiKey
|
||
|
|
in: header
|
||
|
|
name: X-API-Key
|
||
|
|
```
|
||
|
|
|
||
|
|
**OAuth 2.0:**
|
||
|
|
```yaml
|
||
|
|
components:
|
||
|
|
securitySchemes:
|
||
|
|
OAuth2:
|
||
|
|
type: oauth2
|
||
|
|
flows:
|
||
|
|
authorizationCode:
|
||
|
|
authorizationUrl: https://example.com/oauth/authorize
|
||
|
|
tokenUrl: https://example.com/oauth/token
|
||
|
|
scopes:
|
||
|
|
read: Read access
|
||
|
|
write: Write access
|
||
|
|
```
|
||
|
|
|
||
|
|
### Examples
|
||
|
|
|
||
|
|
**Multiple examples:**
|
||
|
|
```yaml
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/User'
|
||
|
|
examples:
|
||
|
|
admin:
|
||
|
|
summary: Admin user
|
||
|
|
value:
|
||
|
|
id: 1
|
||
|
|
name: Admin
|
||
|
|
role: admin
|
||
|
|
regular:
|
||
|
|
summary: Regular user
|
||
|
|
value:
|
||
|
|
id: 2
|
||
|
|
name: John
|
||
|
|
role: user
|
||
|
|
```
|
||
|
|
|
||
|
|
### Tags
|
||
|
|
|
||
|
|
**Organize endpoints:**
|
||
|
|
```yaml
|
||
|
|
tags:
|
||
|
|
- name: Users
|
||
|
|
description: User management
|
||
|
|
- name: Products
|
||
|
|
description: Product catalog
|
||
|
|
- name: Orders
|
||
|
|
description: Order processing
|
||
|
|
|
||
|
|
paths:
|
||
|
|
/users:
|
||
|
|
get:
|
||
|
|
tags:
|
||
|
|
- Users
|
||
|
|
```
|
||
|
|
|
||
|
|
## Complete Example
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
openapi: 3.0.0
|
||
|
|
info:
|
||
|
|
title: Blog API
|
||
|
|
version: 1.0.0
|
||
|
|
description: RESTful API for blog platform
|
||
|
|
|
||
|
|
servers:
|
||
|
|
- url: https://api.blog.com/v1
|
||
|
|
|
||
|
|
paths:
|
||
|
|
/posts:
|
||
|
|
get:
|
||
|
|
summary: List posts
|
||
|
|
tags:
|
||
|
|
- Posts
|
||
|
|
parameters:
|
||
|
|
- $ref: '#/components/parameters/PageParam'
|
||
|
|
- $ref: '#/components/parameters/LimitParam'
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Success
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: '#/components/schemas/Post'
|
||
|
|
meta:
|
||
|
|
$ref: '#/components/schemas/PaginationMeta'
|
||
|
|
|
||
|
|
post:
|
||
|
|
summary: Create post
|
||
|
|
tags:
|
||
|
|
- Posts
|
||
|
|
security:
|
||
|
|
- BearerAuth: []
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- title
|
||
|
|
- content
|
||
|
|
properties:
|
||
|
|
title:
|
||
|
|
type: string
|
||
|
|
content:
|
||
|
|
type: string
|
||
|
|
tags:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
type: string
|
||
|
|
responses:
|
||
|
|
'201':
|
||
|
|
description: Post created
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/Post'
|
||
|
|
|
||
|
|
/posts/{id}:
|
||
|
|
get:
|
||
|
|
summary: Get post
|
||
|
|
tags:
|
||
|
|
- Posts
|
||
|
|
parameters:
|
||
|
|
- name: id
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Success
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/Post'
|
||
|
|
'404':
|
||
|
|
$ref: '#/components/responses/NotFound'
|
||
|
|
|
||
|
|
components:
|
||
|
|
schemas:
|
||
|
|
Post:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
title:
|
||
|
|
type: string
|
||
|
|
content:
|
||
|
|
type: string
|
||
|
|
author:
|
||
|
|
$ref: '#/components/schemas/User'
|
||
|
|
created_at:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
|
||
|
|
User:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: integer
|
||
|
|
name:
|
||
|
|
type: string
|
||
|
|
email:
|
||
|
|
type: string
|
||
|
|
|
||
|
|
PaginationMeta:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
total:
|
||
|
|
type: integer
|
||
|
|
page:
|
||
|
|
type: integer
|
||
|
|
per_page:
|
||
|
|
type: integer
|
||
|
|
|
||
|
|
Error:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
error:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
code:
|
||
|
|
type: string
|
||
|
|
message:
|
||
|
|
type: string
|
||
|
|
|
||
|
|
parameters:
|
||
|
|
PageParam:
|
||
|
|
name: page
|
||
|
|
in: query
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
default: 1
|
||
|
|
|
||
|
|
LimitParam:
|
||
|
|
name: limit
|
||
|
|
in: query
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
default: 20
|
||
|
|
|
||
|
|
responses:
|
||
|
|
NotFound:
|
||
|
|
description: Resource not found
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/Error'
|
||
|
|
|
||
|
|
securitySchemes:
|
||
|
|
BearerAuth:
|
||
|
|
type: http
|
||
|
|
scheme: bearer
|
||
|
|
bearerFormat: JWT
|
||
|
|
|
||
|
|
security:
|
||
|
|
- BearerAuth: []
|
||
|
|
```
|
||
|
|
|
||
|
|
## Generating from Code
|
||
|
|
|
||
|
|
### From Express.js
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// Use swagger-jsdoc
|
||
|
|
/**
|
||
|
|
* @swagger
|
||
|
|
* /users:
|
||
|
|
* get:
|
||
|
|
* summary: List users
|
||
|
|
* responses:
|
||
|
|
* 200:
|
||
|
|
* description: Success
|
||
|
|
*/
|
||
|
|
app.get('/users', (req, res) => {
|
||
|
|
// Handler
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
### From FastAPI (Python)
|
||
|
|
|
||
|
|
```python
|
||
|
|
# FastAPI auto-generates OpenAPI
|
||
|
|
@app.get("/users", response_model=List[User])
|
||
|
|
async def list_users():
|
||
|
|
return users
|
||
|
|
```
|
||
|
|
|
||
|
|
### From ASP.NET Core
|
||
|
|
|
||
|
|
```csharp
|
||
|
|
// Use Swashbuckle
|
||
|
|
[HttpGet]
|
||
|
|
[ProducesResponseType(typeof(List<User>), 200)]
|
||
|
|
public IActionResult GetUsers()
|
||
|
|
{
|
||
|
|
return Ok(users);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Tools
|
||
|
|
|
||
|
|
**Swagger Editor**: https://editor.swagger.io
|
||
|
|
**Swagger UI**: Interactive documentation
|
||
|
|
**Redoc**: Alternative documentation UI
|
||
|
|
**Postman**: Import OpenAPI for testing
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
**Use $ref for reusability:**
|
||
|
|
- Define schemas once
|
||
|
|
- Reference in multiple places
|
||
|
|
- Easier maintenance
|
||
|
|
|
||
|
|
**Include examples:**
|
||
|
|
- Help developers understand
|
||
|
|
- Enable better testing
|
||
|
|
- Show expected formats
|
||
|
|
|
||
|
|
**Document errors:**
|
||
|
|
- All possible status codes
|
||
|
|
- Error response format
|
||
|
|
- Error codes and meanings
|
||
|
|
|
||
|
|
**Version your API:**
|
||
|
|
- Include version in URL or header
|
||
|
|
- Document breaking changes
|
||
|
|
- Maintain old versions
|
||
|
|
|
||
|
|
**Keep it updated:**
|
||
|
|
- Generate from code when possible
|
||
|
|
- Review regularly
|
||
|
|
- Update with API changes
|