OpenAPI Specification Schemas: Difference between revisions
Line 87: | Line 87: | ||
=Composition= | =Composition= | ||
Types can be composed with <code>$ref</code>: | Types can be composed with <code>$ref</code>: | ||
<syntaxhighlight lang='yaml'> | <syntaxhighlight lang='yaml'> | ||
components: | components: | ||
Line 119: | Line 118: | ||
- zip | - zip | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<code>allOf</code> | |||
=A String,String Map= | |||
<syntaxhighlight lang='yaml'> | |||
components: | |||
schemas: | |||
AMap: | |||
type: object | |||
additionalProperties: | |||
type: string | |||
</syntaxhighlight> | |||
The corresponding generated code: | |||
< | <syntaxhighlight lang='go'> | ||
type AMap map[string]string | |||
</syntaxhighlight> | |||
=Polymorphism= | =Polymorphism= |
Revision as of 03:08, 26 January 2024
External
- https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#schemaObject
- https://tools.ietf.org/html/draft-bhutton-json-schema-00
- https://tools.ietf.org/html/draft-bhutton-json-schema-validation-00
Internal
Overview
The /components/schemas
section of the OpenAPI specification defines reusable types that are used as input and output data types. These types can represent objects, but also primitives and arrays. The specification is based on JSON Schema Specification Draft 2020-12. A client or server code generator creates programming language types from these schemas.
This article is annotated with details related to how oapi-codegen
generates Go code.
Schema
SchemaName type: object|string|integer|number|array|boolean format: int32|int64|float|double|password|date|email|file|uuid properties: color: type: string size: type: integer format: int32 minimum: 0 weight: type: number format: double required: - color - size - weight description: discriminator: externalDocs:
A Go type is generated for a schema only if a schema is referred from the specification with schema.$ref
. If the type is declared, but not referred, no code will be generated for it. Alias types are generated: a custom-named typed for integer or string can be generated.
Both the types and their fields are implicitly exported with oapi-codegen
, they get names that start with upper case characters, even if they are declared with lower case characters in the OpenAPI specification.
Schema Name
type
One of the supported data types ("object", "string", "integer", "number", "array", "boolean", etc.):
format
One of the supported formats ( "int32", "int64", "float", "double", "password", "date", "email", etc.):
minimum
properties
For a schema of type object
, properties
contains a map whose keys are the names of the fields. Each map element must mandatorily include type
and optionally format
:
MyType:
type: object
properties:
color: # 'color' is the name of a field of MyType
type: string
size: # 'size' is the name of a field of MyType
type: integer
format: int32
minimum: 0
weight: # 'weight' is the name of a field of MyType
type: number
format: double
required
An array with the name of the required fields:
MyType:
[...]
required:
- color
- size
- weight
If a field is declared as "required", oapi-codegen
will generate the struct
corresponding to the schema with a value for that field. If the field is not among the required fields, the struct
will carry a pointer instead of a the value, presumably so it can be set to nil
.
description
discriminator
externalDocs
Composition
Types can be composed with $ref
:
components:
schemas:
Person:
type: object
properties:
firstName:
type: string
lastName:
type: string
address:
$ref: "#/components/schemas/Address"
required:
- firstName
- lastName
- address
Address:
type: object
properties:
street:
type: string
city:
type: string
zip:
type: integer
format: int32
required:
- street
- city
- zip
allOf
A String,String Map
components:
schemas:
AMap:
type: object
additionalProperties:
type: string
The corresponding generated code:
type AMap map[string]string
Polymorphism
discriminator
TO WRAP UP Example
components:
schemas:
Pet:
allOf:
- $ref: '#/components/schemas/NewPet'
- type: object
required:
- id
properties:
id:
type: integer
format: int64
NewPet:
type: object
required:
- name
properties:
name:
type: string
tag:
type: string