doc: initial docs for openapi support & per-content-type coercion

This commit is contained in:
Joel Kaasinen 2023-03-08 09:32:23 +02:00
parent 52b7402575
commit 8df8bf06cc
6 changed files with 89 additions and 7 deletions

View file

@ -41,6 +41,7 @@
* [Route Data Validation](ring/route_data_validation.md)
* [Compiling Middleware](ring/compiling_middleware.md)
* [Swagger Support](ring/swagger.md)
* [OpenAPI Support](ring/openapi.md)
* [RESTful form methods](ring/RESTful_form_methods.md)
## HTTP

View file

@ -47,6 +47,7 @@
["Route Data Validation" {:file "doc/ring/route_data_validation.md"}]
["Compiling Middleware" {:file "doc/ring/compiling_middleware.md"}]
["Swagger Support" {:file "doc/ring/swagger.md"}]
["OpenAPI Support" {:file "doc/ring/openapi.md"}]
["RESTful form methods" {:file "doc/ring/RESTful_form_methods.md"}]]
["HTTP" {}
["Interceptors" {:file "doc/http/interceptors.md"}]

View file

@ -4,13 +4,14 @@ Basic coercion is explained in detail [in the Coercion Guide](../coercion/coerci
The following request parameters are currently supported:
| type | request source |
|-----------|------------------|
| `:query` | `:query-params` |
| `:body` | `:body-params` |
| `:form` | `:form-params` |
| `:header` | `:header-params` |
| `:path` | `:path-params` |
| type | request source |
|------------|--------------------------------------------------|
| `:query` | `:query-params` |
| `:body` | `:body-params` |
| `:request` | `:body-params`, allows per-content-type coercion |
| `:form` | `:form-params` |
| `:header` | `:header-params` |
| `:path` | `:path-params` |
To enable coercion, the following things need to be done:
@ -148,6 +149,30 @@ Invalid response:
; :in [:response :body]}}
```
## Per-content-type coercion
You can also specify request and response body schemas per content-type. The syntax for this is:
```clj
(def app
(ring/ring-handler
(ring/router
["/api"
["/example" {:post {:coercion reitit.coercion.schema/coercion
:parameters {:request {:content {"application/json" {:y s/Int}
"application/edn" {:z s/Int}}
;; default if no content-type matches:
:body {:yy s/Int}}}
:responses {200 {:content {"application/json" {:w s/Int}
"application/edn" {:x s/Int}}
;; default if no content-type matches:
:body {:ww s/Int}}
:handler ...}}]]
{:data {:middleware [rrc/coerce-exceptions-middleware
rrc/coerce-request-middleware
rrc/coerce-response-middleware]}})))
```
## Pretty printing spec errors
Spec problems are exposed as is in request & response coercion errors. Pretty-printers like [expound](https://github.com/bhb/expound) can be enabled like this:

View file

@ -84,6 +84,8 @@ Server: Jetty(9.2.21.v20170120)
<kikka>kukka</kikka>
```
You can also specify request and response schemas per content-type. See [Coercion](coercion.md) and [OpenAPI Support](openapi.md).
## Changing default parameters

51
doc/ring/openapi.md Normal file
View file

@ -0,0 +1,51 @@
# OpenAPI Support
Reitit can generate [OpenAPI 3.1.0](https://spec.openapis.org/oas/v3.1.0)
documentation. The feature works similarly to [Swagger documentation](swagger.md).
The [http-swagger example](../../examples/http-swagger) also has OpenAPI documentation.
## OpenAPI data
The following route data keys contribute to the generated swagger specification:
| key | description |
| ---------------|-------------|
| :openapi | map of any openapi data. Can contain keys like `:deprecated`.
| :content-types | vector of supported content types. Defaults to `["application/json"]`
| :no-doc | optional boolean to exclude endpoint from api docs
| :tags | optional set of string or keyword tags for an endpoint api docs
| :summary | optional short string summary of an endpoint
| :description | optional long description of an endpoint. Supports http://spec.commonmark.org/
Coercion keys also contribute to the docs:
| key | description |
| --------------|-------------|
| :parameters | optional input parameters for a route, in a format defined by the coercion
| :responses | optional descriptions of responses, in a format defined by coercion
Use `:request` parameter coercion (instead of `:body`) to unlock per-content-type coercions. See [Coercion](coercion.md).
## Swagger spec
Serving the OpenAPI specification is handled by `reitit.openapi/create-openapi-handler`. It takes no arguments and returns a ring handler which collects at request-time data from all routes and returns an OpenAPI specification as Clojure data, to be encoded by a response formatter.
You can use the `:openapi` route data key of the `create-openapi-handler` route to populate the top level of the OpenAPI spec.
Example:
```
["/openapi.json"
{:get {:handler (openapi/create-openapi-handler)
:openapi {:info {:title "my nice api" :version "0.0.1"}}
:no-doc true}}]
```
If you need to post-process the generated spec, just wrap the handler with a custom `Middleware` or an `Interceptor`.
## Swagger-ui
[Swagger-ui](https://github.com/swagger-api/swagger-ui) is a user interface to visualize and interact with the Swagger specification. To make things easy, there is a pre-integrated version of the swagger-ui as a separate module.
- TIP: downgrade to 3.0.0 if needed

View file

@ -6,6 +6,8 @@
Reitit supports [Swagger2](https://swagger.io/) documentation, thanks to [schema-tools](https://github.com/metosin/schema-tools) and [spec-tools](https://github.com/metosin/spec-tools). Documentation is extracted from route definitions, coercion `:parameters` and `:responses` and from a set of new documentation keys.
See also: [OpenAPI support](openapi.md).
To enable swagger-documentation for a Ring router:
1. annotate your routes with swagger-data