OpenAPI Introduction
& Workflow
What is OpenAPI?
A configuration file (JSON or YAML) that describes API requests and responses.
Before version 3 was released, OpenAPI was known as Swagger.
Swagger still exists as a company that provides tooling and services around OpenAPI.
What can OpenAPI do?
- Documentation
- Requests & response validation
- Writing tests
- Powering mock servers
- Code generation
How do you write OpenAPI?
- Raw JSON or YAML
- Swagger Editor
- Stoplight
- IDE plugin
- Auto-generated from doc blocks
- GUI editor
- Stoplight
How do you write OpenAPI?
- Raw JSON or YAML
- Swagger Editor
- Stoplight
- IDE plugin
- Auto-generated from doc blocks
- GUI editor
- Stoplight
Open API Spec
Top-level Properties
{
"openapi": "3.0.0",
"info": {},
"tags": [],
"servers": [],
"components": {},
"paths": {}
}
Components
{
"parameters": {},
"responses": {},
"schemas": {}
}
Parameters
"parameters": {
"PageNumber": {
"name": "page",
"in": "query",
"description": "The page number requested.",
"schema": {
"type": "number",
"example": 1
}
}
}
Parameters are common variables that can exist in the URL query, the URL path, headers, or cookies.
They can also be defined on individual requests.
Responses
"responses": {
"200SuccessfulResponse": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
}
Stores responses that may be shared across various requests
Schemas
"Region": {
"title": "Region",
"description": "A Region model",
"type": "object",
"properties": {
"id": {
"type": "string",
"example": "483"
},
"type": {
"type": "string",
"enum": [
"regions"
]
},
"attributes": {
...
}
}
},
Stores descriptions of any kind of data in your requests or responses.
Writing Schemas
Schema descriptions in OpenAPI are based on an old draft of JSON Schema, but they are both a subset *and* a superset.
https://swagger.io/docs/specification/data-models/
Using this format, you can describe a data model's:
- data type (e.g. 'integer', 'object')
- allowable values (via 'enum')
- validations (e.g. '> 5')
Simple Data Types
"name": {
"type": "string",
"example": "Example Name",
"title": "Name",
"description": "The model's name."
},
"show_feedback_review_links": {
"type": "integer",
"maximum": 5,
"nullable": true
}
Required Properties
"attributes": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {}
}
}
Objects
"attributes": {
"type": "object",
"properties": {
"name": {}
}
}
Arrays
"location_ids": {
"type": "array",
"items": {
"type": "integer"
}
}
"attributes": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
Combining Schemas
The keywords `oneOf`, `anyOf`, and `allOf` allow you to validate against multiple schemas.
`allOf` will validate a model against *all* of the subschemas
"LocationFull": {
"type": "object",
"properties": {
"attributes": {
"allOf": [
{"$ref": "#/components/schemas/LocationAttributes"},
{"$ref": "#/components/schemas/LocationPatchAttributes"}
]
}
}
}
Shared Schemas
Schemas that are stored in the top-level `components` property can be referenced elsewhere in the document using the `$ref` key. This also works for parameters and responses.
"data": {
"type": "object",
"properties": {
"attributes": {
"$ref": "#/components/schemas/FooAttributes"
}
}
}
Combining Schemas
The keywords `oneOf`, `anyOf`, and `allOf` allow you to validate against multiple schemas.
`allOf` will validate a model against *all* of the subschemas
"LocationFull": {
"type": "object",
"properties": {
"attributes": {
"allOf": [
{"$ref": "#/components/schemas/LocationAttributes"},
{"$ref": "#/components/schemas/LocationPatchAttributes"}
]
}
}
}
Paths
"paths": {
"/foo": {
"get": {},
"post": {}
}
},
"paths": {
"/foo/{fooId}": {
"get": {},
"patch": {},
"delete": {}
}
}
Operation
"post": {
"operationId": "CreateFoo",
"description": "Create Foo",
"requestBody": {},
"responses": {
"200": {},
"401": {},
"404": {}
}
}
Requests & Responses
{
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"token": {
"type": "string"
}
}
}
}
}
}
deck
By Daniel Abernathy
deck
- 949