Expand description

This projects serves to enable automatic rendering of openapi.json files, and provides facilities to also serve the documentation alongside your api.

Usage

First, add the following lines to your Cargo.toml

[dependencies]
rocket = { version = "0.5.0-rc.2", default-features = false, features = ["json"] }
schemars = "0.8.10"
okapi = { version = "0.7.0-rc.1" }
rocket_okapi = { version = "0.8.0-rc.2", features = ["swagger"] }

To add documentation to a set of endpoints, a couple of steps are required. The request and response types of the endpoint must implement JsonSchema. Secondly, the function must be marked with #[openapi]. After that, you can simply replace routes! with openapi_get_routes!. This will append an additional route to the resulting Vec<Route>, which contains the openapi.json file that is required by swagger. Now that we have the json file that we need, we can serve the swagger web interface at another endpoint, and we should be able to load the example in the browser!

Example

use rocket::get;
use rocket::serde::json::Json;
use rocket_okapi::{openapi, openapi_get_routes, JsonSchema};
use rocket_okapi::swagger_ui::{make_swagger_ui, SwaggerUIConfig};

#[derive(serde::Serialize, JsonSchema)]
struct Response {
    reply: String,
}

#[openapi]
#[get("/")]
fn my_controller() -> Json<Response> {
    Json(Response {
        reply: "show me the docs!".to_string(),
    })
}

fn get_docs() -> SwaggerUIConfig {
    use rocket_okapi::settings::UrlObject;

    SwaggerUIConfig {
        url: "/my_resource/openapi.json".to_string(),
        ..Default::default()
    }
}

fn main() {
    rocket::build()
        .mount("/my_resource", openapi_get_routes![my_controller])
        .mount("/swagger", make_swagger_ui(&get_docs()))
        .launch();
}

This crate exposes a few macros that can be used to generate and serve routes and OpenApi objects.

  • mount_endpoints_and_merged_docs!{...}: Mount endpoints and mount merged OpenAPI documentation.
  • openapi_get_routes![...]: To generate and add the openapi.json route.
  • openapi_get_routes_spec![...]: To generate and return a list of routes and the openapi spec.
  • openapi_get_spec![...]: To generate and return the openapi spec.

The last 3 macros have very similar behavior, but differ in what they return. Here is a list of the marcos and what they return:

  • openapi_get_routes![...]: Vec<rocket::Route> (adds route for openapi.json)
  • openapi_get_routes_spec![...]: (Vec<rocket::Route>, okapi::openapi3::OpenApi)
  • openapi_get_spec![...]: okapi::openapi3::OpenApi

FAQ

  • Q: My (diesel) database does not implement OpenApiFromRequest.
    A: This is because the parameter does not show up in the path, query or body. So this is considered a Request Guard. There is a derive macro for this, but this does not work in combination with the #[database("...")] marco. You can solve this my implementing it manually, like this:
use rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput};
use rocket_okapi::gen::OpenApiGenerator;
use rocket_sync_db_pools::{diesel, database};

#[database("sqlite_logs")]
pub struct MyDB(diesel::SqliteConnection);

impl<'r> OpenApiFromRequest<'r> for MyDB {
    fn from_request_input(
        _gen: &mut OpenApiGenerator,
        _name: String,
        _required: bool,
    ) -> rocket_okapi::Result<RequestHeaderInput> {
        Ok(RequestHeaderInput::None)
    }
}
  • Q: … does not implement JsonSchema?
    A: The JsonSchema implementation is handled by [Schemars][Schemars], make sure you enabled the right feature flags for it. If it is still not implemented open an issue in the Schemars repo.

  • Q: Can I add custom data to my OpenAPI spec?
    A: Yes, see the Custom Schema example. Okapi also has build in functions if you want to merge the OpenAPI objects manually.

  • More FAQ questions and answers in README.md.

Re-exports

pub use okapi;

Modules

Contains the Generator struct, which you can use to manually control the way a struct is represented in the documentation.

Contains several Rocket Handlers, which are used for serving the json files and the swagger interface.

Contains the functions and structs required to display the RapiDoc UI.

This module contains several traits that correspond to the Rocket traits pertaining to request guards and responses

Contains the trait OpenApiResponder, meaning that a response implementing this trait can be documented.

Contains then OpenApiSettings struct, which can be used to customize the behavior of a Generator.

Contains the functions and structs required to display the Swagger UI.

Assorted function that are used throughout the application.

Macros

Macro to crate a HashMap with a number of key-value pairs in it.

Mount endpoints and mount merged OpenAPI documentation.

A replacement macro for rocket::routes. This also takes a optional settings object.

A replacement macro for rocket::routes. This parses the routes and provides a tuple with 2 parts (Vec<rocket::Route>, OpenApi):

Generate OpenApi spec only, does not generate routes. This can be used in cases where you are only interested in the openAPI spec, but not in the routes. A use case could be inside of build.rs scripts or where you want to alter OpenAPI object at runtime.

Generate and return a closure that can be used to generate the routes.

Generate and return a closure that can be used to generate the OpenAPI specification.

Structs

The error type returned by rocket_okapi when something fails.

Contains information about an endpoint.

Traits

A type which can be described as a JSON Schema document.

Functions

Convert OpenApi object to routable endpoint.

Type Definitions

Type alias for Result<T, OpenApiError>.

Attribute Macros

A proc macro to be used in tandem with one of Rocket’s endpoint macros. It requires that all of the arguments of the route implement one of the traits in rocket_okapi::request, and that the return type implements OpenApiResponder.

Derive Macros

Derive marco for the OpenApiFromRequest trait.