Examples
Practical examples of how to use Serverpod Swagger in different scenarios.
Minimal Setup
The simplest possible integration -- register the route and generate the spec.
1import 'dart:io';
2import 'package:serverpod/serverpod.dart';
3import 'package:serverpod_swagger/serverpod_swagger.dart';
4
5void run(List<String> args) async {
6 final pod = Serverpod(args, Protocol(), Endpoints());
7
8 final swaggerRoute = SwaggerUIRoute(Directory.current);
9 pod.webServer.addRoute(swaggerRoute, '/swagger/**');
10 pod.webServer.addRoute(swaggerRoute, '/swagger');
11
12 await pod.start();
13}dart run serverpod_swagger:generateAccess the Swagger UI at http://localhost:8082/swagger/.
Generation with Authentication
Add JWT authentication to all endpoints, then exclude specific public ones.
# JWT auth on all endpoints, except login and register
dart run serverpod_swagger:generate \
--base-url=http://localhost:8082 \
--auth=jwt \
--unsecure-endpoints=auth/login,auth/registerAfter generating, use the "Authorize" button in Swagger UI to enter your JWT token.
Other Auth Types
# API key auth
dart run serverpod_swagger:generate --auth=apikey
# Basic auth
dart run serverpod_swagger:generate --auth=basic
# OAuth2
dart run serverpod_swagger:generate --auth=oauth2 --base-url=http://localhost:8082HTTP Method Inference
HTTP methods are inferred automatically from your endpoint method names. Given an endpoint like this:
1class UserEndpoint extends Endpoint {
2 Future<List<User>> listUsers(Session session) async { ... }
3 Future<User> getUser(Session session, int id) async { ... }
4 Future<User> createUser(Session session, String name) async { ... }
5 Future<User> updateUser(Session session, int id, String name) async { ... }
6 Future<void> deleteUser(Session session, int id) async { ... }
7 Future<bool> doSomething(Session session) async { ... }
8}The generator will produce:
GET /user/listUsersGET /user/getUserPOST /user/createUserPATCH /user/updateUserDELETE /user/deleteUserPOST /user/doSomething(default for unrecognized names)
Overriding Inferred Methods
# Override specific paths
dart run serverpod_swagger:generate \
--http-method=/user/doSomething:get \
--http-method=/user/updateUser:putUpdating an Existing Spec
Use --update to modify an existing apispec.json without regenerating from source. This is useful for changing auth or base URL on an already-generated spec.
# Add auth to an existing spec
dart run serverpod_swagger:generate --update --auth=jwt
# Change the base URL
dart run serverpod_swagger:generate --update --base-url=https://api.example.com
# Remove all auth
dart run serverpod_swagger:generate --update --unauthProgrammatic API
Build an OpenAPI spec in code without running the CLI.
1import 'package:serverpod_swagger/serverpod_swagger.dart';
2
3final spec = SwaggerSpec();
4
5// Define an endpoint
6final endpoint = SwaggerEndpoint('greeting');
7final method = SwaggerMethod('sayHello');
8method.parameters['name'] = SwaggerParameter(
9 name: 'name',
10 type: 'String',
11 isNullable: false,
12);
13method.returnType = 'String';
14endpoint.methods['sayHello'] = method;
15spec.endpoints['greeting'] = endpoint;
16
17// Generate the OpenAPI map
18final openApiMap = generateOpenApiMap(
19 spec,
20 baseUrl: 'http://localhost:8082',
21);
22
23// Or generate a JSON string directly
24final jsonString = generateOpenApiJson(
25 spec,
26 baseUrl: 'http://localhost:8082',
27);
28
29// Utility: infer HTTP method from a name
30print(inferHttpMethod('getUser')); // 'get'
31print(inferHttpMethod('createUser')); // 'post'
32print(inferHttpMethod('updateUser')); // 'patch'
33print(inferHttpMethod('deleteUser')); // 'delete'
34print(inferHttpMethod('doStuff')); // 'post' (default)Development Workflow
# Terminal 1: run your server
dart run bin/main.dart
# Terminal 2: regenerate spec after making changes
dart run serverpod_swagger:generate
# Then refresh your browser at http://localhost:8082/swagger/The Swagger UI route re-reads apispec.json from disk on every request with no-cache headers, so you see changes immediately after regenerating.