SlideShare a Scribd company logo
Writing REST APIs with OpenAPI
and Swagger Ada
Stéphane Carrez FOSDEM 2018
https://github.com/stcarrez/swagger-ada 2
OpenAPI and Swagger Ada
● Introduction to OpenAPI and Swagger
● Writing a REST Ada client
● Writing a REST Ada server
● Handling security with OAuth2
● Demo
https://github.com/stcarrez/swagger-ada 3
30 years of RPC
● Sun RPC (RFC 1057) in 1988
● CORBA IDL in 1991
● Ada95 Distributed Annex E in 1995
● Java RMI in 2000
● WSDL and SOAP in 2000
● Google gRPC with Protocol Buffers since 2001
https://github.com/stcarrez/swagger-ada 4
30 years but same goals
● Simplify the developer’s job
● Describe the protocol between client & server
● Generate client stubs and server skeleton
● Handle and hide communication details
● Document the client & server interaction
https://github.com/stcarrez/swagger-ada 5
Why REST and OpenAPI?
● REST as an alternative to SOAP since 2000
(Roy Thomas Fielding)
● Easier to use, write, implement, debug
● Can easily be used from browsers
● Increasing usage of REST with mobile applications
● Need for description, documentation
● Need for client language bindings
https://github.com/stcarrez/swagger-ada 6
OpenAPI Specification
● Started in 2010 to describe REST APIs
● OpenAPI Initiative created in Nov 5, 2015
(Google, Microsoft, IBM, Paypal, ...)
● OpenAPI 3.0 released July 26, 2017
● https://github.com/OAI/OpenAPI-Specification
https://github.com/stcarrez/swagger-ada 7
OpenAPI 2.0 Document Structure
info
security
securityDefinitions
consumesproduces
paths
tags externalDocs
definitions
parameters
responses
host
basePath
schemes
Describes security aspects
YAML or JSON file with well defined keywords
Describes REST APIs paths,
operations, can reference definitions,
parameters, responses
Describes data types, parameters,
responses
What the API accepts as input,
what it produces
https://github.com/stcarrez/swagger-ada 8
OpenAPI benefits
info
security
securityDefinitions
consumesproduces
paths
tags externalDocs
definitions
parameters
responses
host
basePath
schemes
Documentation
Client Binding
Server Skeleton
Server Configuration
Online Documentation
API Validation
https://github.com/stcarrez/swagger-ada 9
Swagger: Tools for OpenAPI
● Online Editor: Swagger Editor
● Generator: Swagger Codegen
● Documentation: Swagger UI
● Sources: https://github.com/swagger-api
SWAGGER
https://github.com/stcarrez/swagger-ada 10
Swagger Editor:
https://editor.swagger.io
https://github.com/stcarrez/swagger-ada 11
Swagger Codegen
OpenAPI
Document
YAML
JSON{ }
{...}
Swagger
Codegen
API
Doc
(HTML)
Ada
REST
Client
Ada
REST
Server
Java
REST
Client
Java
REST
Server
...
Python
REST
Client
Python
Flask
Server
...
25+
Programming Languages
https://github.com/stcarrez/swagger-ada 12
Writing a REST Ada client
● Get the OpenAPI/Swagger description file
– From SwaggerHub: https://swaggerhub.com/
– From APIs.guru: https://apis.guru/openapi-directory/
● Generate the Ada client code
● Use the generated code to make API calls
https://github.com/stcarrez/swagger-ada 13
OpenAPI: Info description (1/3)
● YAML or JSON file
● General purpose description of the API
● Describe the service entry point
swagger: "2.0"
info:
version: "1.0"
title: "Todo API"
contact:
email: Stephane.Carrez@gmail.com
license:
name: Apache 2.0
url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
host: localhost:8080
basePath: /v1
tags:
- name: tasks
description: Operations to manage tasks
schemes:
- https
- http
https://github.com/stcarrez/swagger-ada 14
OpenAPI: REST operation (2/3)
● Describe the REST operations
paths:
/todos:
get:
tags:
- tasks
summary: List the available tasks
description: List the available tasks
operationId: listTodos
produces:
- application/json
parameters:
- name: status
in: query
description: Filters the task by their status
required: false
type: string
enum:
- done
- waiting
- working
- all
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/Todo'
'400':
description: Invalid status value
https://github.com/stcarrez/swagger-ada 15
OpenAPI: Model definitions (3/3)
definitions:
Todo:
type: object
properties:
id:
type: integer
format: int64
description: The todo identifier
title:
type: string
description: The todo title
create_date:
type: string
format: date-time
description: The todo creation date
done_date:
type: string
format: date-time
description: The todo resolution date
status:
type: string
description: The todo state
enum:
- waiting
- done
required:
- id
- title
- status
- create_date
https://github.com/stcarrez/swagger-ada 16
Client: let’s generate the code!
● Generate the client code with Swagger Codegen
$ java -jar swagger-codegen-cli.jar generate -l ada -i todo.yaml 
-DprojectName=Todos --model-package Todos
Client API: package Todos.Clients
Model API: package Todos.Models
Sample: procedure Todos.Client
GNAT project
https://github.com/stcarrez/swagger-ada 17
Ada REST Client
Generated code
Your client code and application
Swagger runtime
Choose between libcurl or AWS
Brings security with OAuth2 support
Brings JSON/XML serialization
deserialization and more
Ada Security
Swagger Ada
Ada Utility Library
CURL AWS
Client API & Model
Client Application
XML/Ada
https://github.com/stcarrez/swagger-ada 18
Client and Server Data Model
● Data types described in the Models package
● Same Models Ada package for client and server
● Operations to serialize and deserialize (JSON/XML)
package Todos.Models is
   type Todo_Type is record
      Id          : Swagger.Long;
      Title       : Swagger.UString;
      Create_Date : Swagger.Datetime;
      Done_Date   : Swagger.Nullable_Date;
      Status      : Swagger.UString;
   end record;
   package Todo_Type_Vectors is
      new Ada.Containers.Vectors
        (Positive, Todo_Type);
end Todos.Models;
Todo:
type: object
properties:
id:
type: integer
format: int64
description: The todo identifier
title:
type: string
description: The todo title
create_date:
type: string
format: date-time
description: The todo creation date
done_date:
type: string
format: date-time
description: The todo resolution date
status:
type: string
description: The todo state
enum:
- waiting
- done
https://github.com/stcarrez/swagger-ada 19
Client API
● Represented by the Client_Type tagged record
● Provides operations described by the OpenAPI
● Allows to control the API call (headers, security)
package Todos.Clients is
   type Client_Type is
      new Swagger.Clients.Client_Type with null record; 
   
   procedure Create_Todo (Client : in out Client_Type;
                          Title  : in Swagger.Ustring;
                          Result : out Todos.Models.Todo_Type);
   procedure List_Todos (Client : in out Client_Type;
                         Status : in out Swagger.Nullable_UString;
                         Result : out Todos.Models.Todo_Vector);
end Todos.Clients;
https://github.com/stcarrez/swagger-ada 20
Calling REST in Ada
● Declare a Client_Type instance
● Configure it (server URL, credentials)
● Call the operation with its parameters
with Todos.Clients;
with Todos.Models;
...
  Client : Todos.Clients.Client_Type;
  List   : Todos.Models.Todo_Type_Vectors.Vector;
  Empty  : Swagger.Nullable_String := (Is_Null => True, Value => <>);
  ...
    Client.Set_Server (“http://localhost:8080/v1”);
    Client.List_Todos (Empty, List);
https://github.com/stcarrez/swagger-ada 21
Writing a REST Ada server
● Write the OpenAPI/Swagger description file
● Generate the Ada server code
● Implement the server operations
● Share the OpenAPI description on SwaggerHub!
https://github.com/stcarrez/swagger-ada 22
Server: let’s generate the code!
$ java -jar swagger-codegen-cli.jar generate -l ada-server -i todo.yaml 
-DprojectName=Todos --model-package Todos
● Generate the server code with Swagger Codegen
Server skeleton: package Todos.Skeletons
Model API: package Todos.Models
Server: procedure Todos.Server
GNAT project, server configuration file
Server code: package Todos.Servers
https://github.com/stcarrez/swagger-ada 23
Ada REST Server
Generated code
Your server code and application
Swagger runtime
Brings REST server support with
security and OAuth2 support on
server side
Ada Security
Swagger Ada
Ada Utility Library
Server Skeleton & Model
Server Application
Ada Servlet
XML/Ada AWS
https://github.com/stcarrez/swagger-ada 24
Server Skeleton
● Declares the Server_Type limited interface to describe the operations
● Additional Context_Type object gives access to request, response
● Two generic packages for server skeleton provide two server models:
– Instance per request
– Global shared instance within a protected object
package Todos.Skeletons is
   type Server_Type is limited interface;
   
   procedure Create_Todo
      (Server  : in out Server_Type;
       Title   : in Swagger.Ustring;
       Result  : out Todos.Models.Todo_Type;
       Context : in out Swagger.Servers.Context_Type) is abstract;
   ...
end Todos.Skeletons;
https://github.com/stcarrez/swagger-ada 25
Server Implementation (1/2)
● Implement the Server_Type interface with its operations
● Populate Result or use the Context to send an error
● Serialization/Deserialization handled by the skeleton
package Todos.Servers is
   type Server_Type is limited new Todos.Skeletons.Server_Type ...
   
   overriding procedure Create_Todo
      (Server  : in out Server_Type;
       Title   : in Swagger.Ustring;
       Result  : out Todos.Models.Todo_Type;
       Context : in out Swagger.Servers.Context_Type);
   ...
end Todos.Servers;
https://github.com/stcarrez/swagger-ada 26
Server Implementation (2/2)
● Instantiate one of the two server skeletons
(per-request model or shared model)
● Register the OpenAPI to the application
package Todos.Servers is
   ...
   package Server_Impl is
      new Todos.Skeletons.Shared_Instance (Server_Type);
end Todos.Servers;
procedure Todos.Server is
   App : aliased Swagger.Servers.Applications.Application_Type;
begin
   . . .
   Todos.Servers.Server_Impl.Register (App);
   . . .
end Todos.Server;
https://github.com/stcarrez/swagger-ada 27
OpenAPI: Describing security
● Describe security endpoints
● Describe security scopes
● Assign required security scopes to operations
paths:
/todos:
get:
...
parameters:
...
responses:
...
security:
- todo_auth:
- 'read:todo'
Security:
- todo_auth: []
securityDefinitions:
todo_auth:
type: oauth2
flow: password
tokenUrl: /v1/oauth/token
scopes:
'write:todo': Write a todo
'read:todo': Read a todo
https://github.com/stcarrez/swagger-ada 28
Client Security with OAuth2 (1/2)
● Create and initialize a credentials object
● Obtain the access token and optional refresh token
● Configure the client to use the credentials
with Swagger.Credentials.OAuth;
Cred : aliased Swagger.Credentials.OAuth.OAuth2_Credential_Type;
...
   Cred.Set_Application_Identifier ("todo­app");
   Cred.Set_Application_Secret ("todo­app­secret");
   Cred.Set_Provider_URI ("http://localhost:8080/v1/oauth/token");
   Cred.Request_Token (Username, Password, "read:todo write:todo");
...
   Client.Set_Credentials (Cred’Access);
https://github.com/stcarrez/swagger-ada 29
Client Security with OAuth2 (2/2)
● Make API calls: credentials are passed on the wire within the
‘Authorization’ header
List : Todos.Models.Todo_Type_Vectors.Vector;
...
   Client.List_Todos (Empty, List);
GET /v1/todos HTTP/1.1
Host: localhost:8080
Authorization: Bearer 74rE0wU.d44CPAll_kyyB2krd8bYdVYWqgmtloIR.9zyiBM
Accept: application/json
https://github.com/stcarrez/swagger-ada 30
Server security (1/2)
● Each OpenAPI scope represented by a
permission definition (generated code):
● Authentication and permission check generated in
the server skeleton (generated code):
if not Context.Is_Authenticated then
   Context.Set_Error (401, "Not authenticated");
   return;
end if;
if not Context.Has_Permission (ACL_Read_Todo.Permission) then
   Context.Set_Error (403, "Permission denied");
   return;
end if;
package ACL_Read_Todo
   is new Security.Permissions.Definition ("read:todo");
https://github.com/stcarrez/swagger-ada 31
Server security (2/2)
● Configure the server key for OAuth2 tokens:
● Configure the server to register the client id and secret
● Configure the users allowed to authenticate
app.list=1
app.1.client_id=todo­app
app.1.client_secret=todo­app­secret
app.1.scope=none
users.list=1,2
users.1.username=admin
users.1.password=admin
users.2.username=test
users.2.password=test
swagger.key=Y29naGk5SGkKUG9YaTdhaHgKYWlUaGllM3UK
https://github.com/stcarrez/swagger-ada 32
Demo: Todo client
https://github.com/stcarrez/swagger-ada 33
Demo: Todo server (main)
https://github.com/stcarrez/swagger-ada 34
Demo: Todo server (impl)
https://github.com/stcarrez/swagger-ada 35
Demo: Running the client
Server not started
404 error received
https://github.com/stcarrez/swagger-ada 36
Limitations and improvements
● Ada Strings
(need a lot of To_String/To_Ustring conversions)
● Enums are treated as strings
● Circular type dependencies not handled
● Error model needs some work
● Improvements:
– Upload file support
– Asynchronous client operation call
https://github.com/stcarrez/swagger-ada 37
Conclusion
● OpenAPI describes REST APIs
● Swagger Codegen generates Ada code for you
● Swagger Ada is a runtime library for REST
client and REST server implementation
● More than 500 APIs available, write your own!
● Next step: … GraphQL?

More Related Content

PDF
Building APIs with the OpenApi Spec
Pedro J. Molina
 
PDF
Swagger / Quick Start Guide
Andrii Gakhov
 
PPTX
Rest API with Swagger and NodeJS
Luigi Saetta
 
PDF
Designing APIs with OpenAPI Spec
Adam Paxton
 
PPTX
Introducing Swagger
Tony Tam
 
PPTX
API Docs with OpenAPI 3.0
Fabrizio Ferri-Benedetti
 
PPTX
Introducing OpenAPI Version 3.1
SmartBear
 
Building APIs with the OpenApi Spec
Pedro J. Molina
 
Swagger / Quick Start Guide
Andrii Gakhov
 
Rest API with Swagger and NodeJS
Luigi Saetta
 
Designing APIs with OpenAPI Spec
Adam Paxton
 
Introducing Swagger
Tony Tam
 
API Docs with OpenAPI 3.0
Fabrizio Ferri-Benedetti
 
Introducing OpenAPI Version 3.1
SmartBear
 

What's hot (20)

PPTX
OpenAPI at Scale
Nordic APIs
 
PDF
OpenAPI development with Python
Takuro Wada
 
PDF
OpenAPI 3.0, And What It Means for the Future of Swagger
SmartBear
 
PDF
Documenting your REST API with Swagger - JOIN 2014
JWORKS powered by Ordina
 
PDF
Swagger UI
Walaa Hamdy Assy
 
PPTX
REST API Design & Development
Ashok Pundit
 
PDF
Developing Faster with Swagger
Tony Tam
 
PPTX
RESTful API - Best Practices
Tricode (part of Dept)
 
PPTX
What is Swagger?
Philip Senger
 
ODP
Introduction to Swagger
Knoldus Inc.
 
PDF
Opentracing jaeger
Oracle Korea
 
PDF
API Gateway How-To: The Many Ways to Apply the Gateway Pattern
VMware Tanzu
 
PPTX
Document your rest api using swagger - Devoxx 2015
johannes_fiala
 
PDF
Cloud Infrastructure with Crossplane
QAware GmbH
 
PDF
Swagger With REST APIs.pptx.pdf
Knoldus Inc.
 
PPTX
OpenTelemetry For Developers
Kevin Brockhoff
 
PDF
Open API and API Management - Introduction and Comparison of Products: TIBCO ...
Kai Wähner
 
PDF
GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...
luisw19
 
PDF
Getting Started with Spring for GraphQL
VMware Tanzu
 
PDF
POST/CON 2019 Workshop: Testing, Automated Testing, and Reporting APIs with P...
Postman
 
OpenAPI at Scale
Nordic APIs
 
OpenAPI development with Python
Takuro Wada
 
OpenAPI 3.0, And What It Means for the Future of Swagger
SmartBear
 
Documenting your REST API with Swagger - JOIN 2014
JWORKS powered by Ordina
 
Swagger UI
Walaa Hamdy Assy
 
REST API Design & Development
Ashok Pundit
 
Developing Faster with Swagger
Tony Tam
 
RESTful API - Best Practices
Tricode (part of Dept)
 
What is Swagger?
Philip Senger
 
Introduction to Swagger
Knoldus Inc.
 
Opentracing jaeger
Oracle Korea
 
API Gateway How-To: The Many Ways to Apply the Gateway Pattern
VMware Tanzu
 
Document your rest api using swagger - Devoxx 2015
johannes_fiala
 
Cloud Infrastructure with Crossplane
QAware GmbH
 
Swagger With REST APIs.pptx.pdf
Knoldus Inc.
 
OpenTelemetry For Developers
Kevin Brockhoff
 
Open API and API Management - Introduction and Comparison of Products: TIBCO ...
Kai Wähner
 
GraphQL as an alternative approach to REST (as presented at Java2Days/CodeMon...
luisw19
 
Getting Started with Spring for GraphQL
VMware Tanzu
 
POST/CON 2019 Workshop: Testing, Automated Testing, and Reporting APIs with P...
Postman
 
Ad

Similar to Writing REST APIs with OpenAPI and Swagger Ada (20)

PDF
API First with Connexion - PyConWeb 2018
Henning Jacobs
 
PDF
APIs for API Management: Consume and Develop Apps
WSO2
 
PDF
Introduction to the Archivematica API (September 2018)
Artefactual Systems - Archivematica
 
PDF
Gatling Performance Workshop
Sai Krishna
 
PDF
Driving containerd operations with gRPC
Docker, Inc.
 
PDF
Get your teeth into Plack
Workhorse Computing
 
PPTX
Where is my scalable API?
Juan Pablo Genovese
 
PDF
Go swagger tutorial how to create golang api documentation using go swagger (1)
Katy Slemon
 
PDF
Cloud Native API Design and Management
AllBits BVBA (freelancer)
 
PDF
REST in Peace. Long live gRPC!
QAware GmbH
 
PDF
apidays LIVE Helsinki - Implementing OpenAPI and GraphQL Services with gRPC b...
apidays
 
PPTX
Consuming Restful APIs using Swagger v2.0
Pece Nikolovski
 
PDF
Cloud native IPC for Microservices Workshop @ Containerdays 2022
QAware GmbH
 
PPTX
Write an API for Almost Anything: The Amazing Power and Flexibility of Django...
Caktus Group
 
PDF
Apigility introduction v2 (glasgow php)
Engineor
 
PPTX
Where is my scalable api?
Altoros
 
PPTX
Session: A Reference Architecture for Running Modern APIs with NGINX Unit and...
NGINX, Inc.
 
PDF
Introduction to CloudStack API
Krunal Jain
 
PDF
how to use openstack api
Liang Bo
 
PPTX
Connecting the Dots: Kong for GraphQL Endpoints
Julien Bataillé
 
API First with Connexion - PyConWeb 2018
Henning Jacobs
 
APIs for API Management: Consume and Develop Apps
WSO2
 
Introduction to the Archivematica API (September 2018)
Artefactual Systems - Archivematica
 
Gatling Performance Workshop
Sai Krishna
 
Driving containerd operations with gRPC
Docker, Inc.
 
Get your teeth into Plack
Workhorse Computing
 
Where is my scalable API?
Juan Pablo Genovese
 
Go swagger tutorial how to create golang api documentation using go swagger (1)
Katy Slemon
 
Cloud Native API Design and Management
AllBits BVBA (freelancer)
 
REST in Peace. Long live gRPC!
QAware GmbH
 
apidays LIVE Helsinki - Implementing OpenAPI and GraphQL Services with gRPC b...
apidays
 
Consuming Restful APIs using Swagger v2.0
Pece Nikolovski
 
Cloud native IPC for Microservices Workshop @ Containerdays 2022
QAware GmbH
 
Write an API for Almost Anything: The Amazing Power and Flexibility of Django...
Caktus Group
 
Apigility introduction v2 (glasgow php)
Engineor
 
Where is my scalable api?
Altoros
 
Session: A Reference Architecture for Running Modern APIs with NGINX Unit and...
NGINX, Inc.
 
Introduction to CloudStack API
Krunal Jain
 
how to use openstack api
Liang Bo
 
Connecting the Dots: Kong for GraphQL Endpoints
Julien Bataillé
 
Ad

More from Stephane Carrez (9)

PDF
Automating License Identification with SPDX-Tool in Ada
Stephane Carrez
 
PDF
Implementing a build manager in Ada
Stephane Carrez
 
PDF
Porion a new Build Manager
Stephane Carrez
 
PDF
Protect Sensitive Data with Ada Keystore
Stephane Carrez
 
PDF
AKT un outil pour sécuriser vos données et documents sensibles
Stephane Carrez
 
PDF
Ada for Web Development
Stephane Carrez
 
PDF
Secure Web Applications with AWA
Stephane Carrez
 
PDF
Persistence with Ada Database Objects (ADO)
Stephane Carrez
 
PDF
IP Network Stack in Ada 2012 and the Ravenscar Profile
Stephane Carrez
 
Automating License Identification with SPDX-Tool in Ada
Stephane Carrez
 
Implementing a build manager in Ada
Stephane Carrez
 
Porion a new Build Manager
Stephane Carrez
 
Protect Sensitive Data with Ada Keystore
Stephane Carrez
 
AKT un outil pour sécuriser vos données et documents sensibles
Stephane Carrez
 
Ada for Web Development
Stephane Carrez
 
Secure Web Applications with AWA
Stephane Carrez
 
Persistence with Ada Database Objects (ADO)
Stephane Carrez
 
IP Network Stack in Ada 2012 and the Ravenscar Profile
Stephane Carrez
 

Recently uploaded (20)

PPT
Activate_Methodology_Summary presentatio
annapureddyn
 
PPTX
Maximizing Revenue with Marketo Measure: A Deep Dive into Multi-Touch Attribu...
bbedford2
 
PDF
PFAS Reporting Requirements 2026 Are You Submission Ready Certivo.pdf
Certivo Inc
 
PPTX
TestNG for Java Testing and Automation testing
ssuser0213cb
 
PPTX
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
PPTX
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
PDF
Jenkins: An open-source automation server powering CI/CD Automation
SaikatBasu37
 
PDF
Wondershare Filmora 14.5.20.12999 Crack Full New Version 2025
gsgssg2211
 
PDF
How to Seamlessly Integrate Salesforce Data Cloud with Marketing Cloud.pdf
NSIQINFOTECH
 
PPTX
ConcordeApp: Engineering Global Impact & Unlocking Billions in Event ROI with AI
chastechaste14
 
PPTX
Visualising Data with Scatterplots in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PDF
The Role of Automation and AI in EHS Management for Data Centers.pdf
TECH EHS Solution
 
PDF
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
PPTX
slidesgo-unlocking-the-code-the-dynamic-dance-of-variables-and-constants-2024...
kr2589474
 
PDF
lesson-2-rules-of-netiquette.pdf.bshhsjdj
jasmenrojas249
 
PDF
IEEE-CS Tech Predictions, SWEBOK and Quantum Software: Towards Q-SWEBOK
Hironori Washizaki
 
PDF
49784907924775488180_LRN2959_Data_Pump_23ai.pdf
Abilash868456
 
PPTX
Odoo Integration Services by Candidroot Solutions
CandidRoot Solutions Private Limited
 
PDF
ShowUs: Pharo Stream Deck (ESUG 2025, Gdansk)
ESUG
 
PDF
Key Features to Look for in Arizona App Development Services
Net-Craft.com
 
Activate_Methodology_Summary presentatio
annapureddyn
 
Maximizing Revenue with Marketo Measure: A Deep Dive into Multi-Touch Attribu...
bbedford2
 
PFAS Reporting Requirements 2026 Are You Submission Ready Certivo.pdf
Certivo Inc
 
TestNG for Java Testing and Automation testing
ssuser0213cb
 
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
Jenkins: An open-source automation server powering CI/CD Automation
SaikatBasu37
 
Wondershare Filmora 14.5.20.12999 Crack Full New Version 2025
gsgssg2211
 
How to Seamlessly Integrate Salesforce Data Cloud with Marketing Cloud.pdf
NSIQINFOTECH
 
ConcordeApp: Engineering Global Impact & Unlocking Billions in Event ROI with AI
chastechaste14
 
Visualising Data with Scatterplots in IBM SPSS Statistics.pptx
Version 1 Analytics
 
The Role of Automation and AI in EHS Management for Data Centers.pdf
TECH EHS Solution
 
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
slidesgo-unlocking-the-code-the-dynamic-dance-of-variables-and-constants-2024...
kr2589474
 
lesson-2-rules-of-netiquette.pdf.bshhsjdj
jasmenrojas249
 
IEEE-CS Tech Predictions, SWEBOK and Quantum Software: Towards Q-SWEBOK
Hironori Washizaki
 
49784907924775488180_LRN2959_Data_Pump_23ai.pdf
Abilash868456
 
Odoo Integration Services by Candidroot Solutions
CandidRoot Solutions Private Limited
 
ShowUs: Pharo Stream Deck (ESUG 2025, Gdansk)
ESUG
 
Key Features to Look for in Arizona App Development Services
Net-Craft.com
 

Writing REST APIs with OpenAPI and Swagger Ada

  • 1. Writing REST APIs with OpenAPI and Swagger Ada Stéphane Carrez FOSDEM 2018
  • 2. https://github.com/stcarrez/swagger-ada 2 OpenAPI and Swagger Ada ● Introduction to OpenAPI and Swagger ● Writing a REST Ada client ● Writing a REST Ada server ● Handling security with OAuth2 ● Demo
  • 3. https://github.com/stcarrez/swagger-ada 3 30 years of RPC ● Sun RPC (RFC 1057) in 1988 ● CORBA IDL in 1991 ● Ada95 Distributed Annex E in 1995 ● Java RMI in 2000 ● WSDL and SOAP in 2000 ● Google gRPC with Protocol Buffers since 2001
  • 4. https://github.com/stcarrez/swagger-ada 4 30 years but same goals ● Simplify the developer’s job ● Describe the protocol between client & server ● Generate client stubs and server skeleton ● Handle and hide communication details ● Document the client & server interaction
  • 5. https://github.com/stcarrez/swagger-ada 5 Why REST and OpenAPI? ● REST as an alternative to SOAP since 2000 (Roy Thomas Fielding) ● Easier to use, write, implement, debug ● Can easily be used from browsers ● Increasing usage of REST with mobile applications ● Need for description, documentation ● Need for client language bindings
  • 6. https://github.com/stcarrez/swagger-ada 6 OpenAPI Specification ● Started in 2010 to describe REST APIs ● OpenAPI Initiative created in Nov 5, 2015 (Google, Microsoft, IBM, Paypal, ...) ● OpenAPI 3.0 released July 26, 2017 ● https://github.com/OAI/OpenAPI-Specification
  • 7. https://github.com/stcarrez/swagger-ada 7 OpenAPI 2.0 Document Structure info security securityDefinitions consumesproduces paths tags externalDocs definitions parameters responses host basePath schemes Describes security aspects YAML or JSON file with well defined keywords Describes REST APIs paths, operations, can reference definitions, parameters, responses Describes data types, parameters, responses What the API accepts as input, what it produces
  • 8. https://github.com/stcarrez/swagger-ada 8 OpenAPI benefits info security securityDefinitions consumesproduces paths tags externalDocs definitions parameters responses host basePath schemes Documentation Client Binding Server Skeleton Server Configuration Online Documentation API Validation
  • 9. https://github.com/stcarrez/swagger-ada 9 Swagger: Tools for OpenAPI ● Online Editor: Swagger Editor ● Generator: Swagger Codegen ● Documentation: Swagger UI ● Sources: https://github.com/swagger-api SWAGGER
  • 11. https://github.com/stcarrez/swagger-ada 11 Swagger Codegen OpenAPI Document YAML JSON{ } {...} Swagger Codegen API Doc (HTML) Ada REST Client Ada REST Server Java REST Client Java REST Server ... Python REST Client Python Flask Server ... 25+ Programming Languages
  • 12. https://github.com/stcarrez/swagger-ada 12 Writing a REST Ada client ● Get the OpenAPI/Swagger description file – From SwaggerHub: https://swaggerhub.com/ – From APIs.guru: https://apis.guru/openapi-directory/ ● Generate the Ada client code ● Use the generated code to make API calls
  • 13. https://github.com/stcarrez/swagger-ada 13 OpenAPI: Info description (1/3) ● YAML or JSON file ● General purpose description of the API ● Describe the service entry point swagger: "2.0" info: version: "1.0" title: "Todo API" contact: email: [email protected] license: name: Apache 2.0 url: 'http://www.apache.org/licenses/LICENSE-2.0.html' host: localhost:8080 basePath: /v1 tags: - name: tasks description: Operations to manage tasks schemes: - https - http
  • 14. https://github.com/stcarrez/swagger-ada 14 OpenAPI: REST operation (2/3) ● Describe the REST operations paths: /todos: get: tags: - tasks summary: List the available tasks description: List the available tasks operationId: listTodos produces: - application/json parameters: - name: status in: query description: Filters the task by their status required: false type: string enum: - done - waiting - working - all responses: '200': description: successful operation schema: type: array items: $ref: '#/definitions/Todo' '400': description: Invalid status value
  • 15. https://github.com/stcarrez/swagger-ada 15 OpenAPI: Model definitions (3/3) definitions: Todo: type: object properties: id: type: integer format: int64 description: The todo identifier title: type: string description: The todo title create_date: type: string format: date-time description: The todo creation date done_date: type: string format: date-time description: The todo resolution date status: type: string description: The todo state enum: - waiting - done required: - id - title - status - create_date
  • 16. https://github.com/stcarrez/swagger-ada 16 Client: let’s generate the code! ● Generate the client code with Swagger Codegen $ java -jar swagger-codegen-cli.jar generate -l ada -i todo.yaml -DprojectName=Todos --model-package Todos Client API: package Todos.Clients Model API: package Todos.Models Sample: procedure Todos.Client GNAT project
  • 17. https://github.com/stcarrez/swagger-ada 17 Ada REST Client Generated code Your client code and application Swagger runtime Choose between libcurl or AWS Brings security with OAuth2 support Brings JSON/XML serialization deserialization and more Ada Security Swagger Ada Ada Utility Library CURL AWS Client API & Model Client Application XML/Ada
  • 18. https://github.com/stcarrez/swagger-ada 18 Client and Server Data Model ● Data types described in the Models package ● Same Models Ada package for client and server ● Operations to serialize and deserialize (JSON/XML) package Todos.Models is    type Todo_Type is record       Id          : Swagger.Long;       Title       : Swagger.UString;       Create_Date : Swagger.Datetime;       Done_Date   : Swagger.Nullable_Date;       Status      : Swagger.UString;    end record;    package Todo_Type_Vectors is       new Ada.Containers.Vectors         (Positive, Todo_Type); end Todos.Models; Todo: type: object properties: id: type: integer format: int64 description: The todo identifier title: type: string description: The todo title create_date: type: string format: date-time description: The todo creation date done_date: type: string format: date-time description: The todo resolution date status: type: string description: The todo state enum: - waiting - done
  • 19. https://github.com/stcarrez/swagger-ada 19 Client API ● Represented by the Client_Type tagged record ● Provides operations described by the OpenAPI ● Allows to control the API call (headers, security) package Todos.Clients is    type Client_Type is       new Swagger.Clients.Client_Type with null record;         procedure Create_Todo (Client : in out Client_Type;                           Title  : in Swagger.Ustring;                           Result : out Todos.Models.Todo_Type);    procedure List_Todos (Client : in out Client_Type;                          Status : in out Swagger.Nullable_UString;                          Result : out Todos.Models.Todo_Vector); end Todos.Clients;
  • 20. https://github.com/stcarrez/swagger-ada 20 Calling REST in Ada ● Declare a Client_Type instance ● Configure it (server URL, credentials) ● Call the operation with its parameters with Todos.Clients; with Todos.Models; ...   Client : Todos.Clients.Client_Type;   List   : Todos.Models.Todo_Type_Vectors.Vector;   Empty  : Swagger.Nullable_String := (Is_Null => True, Value => <>);   ...     Client.Set_Server (“http://localhost:8080/v1”);     Client.List_Todos (Empty, List);
  • 21. https://github.com/stcarrez/swagger-ada 21 Writing a REST Ada server ● Write the OpenAPI/Swagger description file ● Generate the Ada server code ● Implement the server operations ● Share the OpenAPI description on SwaggerHub!
  • 22. https://github.com/stcarrez/swagger-ada 22 Server: let’s generate the code! $ java -jar swagger-codegen-cli.jar generate -l ada-server -i todo.yaml -DprojectName=Todos --model-package Todos ● Generate the server code with Swagger Codegen Server skeleton: package Todos.Skeletons Model API: package Todos.Models Server: procedure Todos.Server GNAT project, server configuration file Server code: package Todos.Servers
  • 23. https://github.com/stcarrez/swagger-ada 23 Ada REST Server Generated code Your server code and application Swagger runtime Brings REST server support with security and OAuth2 support on server side Ada Security Swagger Ada Ada Utility Library Server Skeleton & Model Server Application Ada Servlet XML/Ada AWS
  • 24. https://github.com/stcarrez/swagger-ada 24 Server Skeleton ● Declares the Server_Type limited interface to describe the operations ● Additional Context_Type object gives access to request, response ● Two generic packages for server skeleton provide two server models: – Instance per request – Global shared instance within a protected object package Todos.Skeletons is    type Server_Type is limited interface;        procedure Create_Todo       (Server  : in out Server_Type;        Title   : in Swagger.Ustring;        Result  : out Todos.Models.Todo_Type;        Context : in out Swagger.Servers.Context_Type) is abstract;    ... end Todos.Skeletons;
  • 25. https://github.com/stcarrez/swagger-ada 25 Server Implementation (1/2) ● Implement the Server_Type interface with its operations ● Populate Result or use the Context to send an error ● Serialization/Deserialization handled by the skeleton package Todos.Servers is    type Server_Type is limited new Todos.Skeletons.Server_Type ...        overriding procedure Create_Todo       (Server  : in out Server_Type;        Title   : in Swagger.Ustring;        Result  : out Todos.Models.Todo_Type;        Context : in out Swagger.Servers.Context_Type);    ... end Todos.Servers;
  • 26. https://github.com/stcarrez/swagger-ada 26 Server Implementation (2/2) ● Instantiate one of the two server skeletons (per-request model or shared model) ● Register the OpenAPI to the application package Todos.Servers is    ...    package Server_Impl is       new Todos.Skeletons.Shared_Instance (Server_Type); end Todos.Servers; procedure Todos.Server is    App : aliased Swagger.Servers.Applications.Application_Type; begin    . . .    Todos.Servers.Server_Impl.Register (App);    . . . end Todos.Server;
  • 27. https://github.com/stcarrez/swagger-ada 27 OpenAPI: Describing security ● Describe security endpoints ● Describe security scopes ● Assign required security scopes to operations paths: /todos: get: ... parameters: ... responses: ... security: - todo_auth: - 'read:todo' Security: - todo_auth: [] securityDefinitions: todo_auth: type: oauth2 flow: password tokenUrl: /v1/oauth/token scopes: 'write:todo': Write a todo 'read:todo': Read a todo
  • 28. https://github.com/stcarrez/swagger-ada 28 Client Security with OAuth2 (1/2) ● Create and initialize a credentials object ● Obtain the access token and optional refresh token ● Configure the client to use the credentials with Swagger.Credentials.OAuth; Cred : aliased Swagger.Credentials.OAuth.OAuth2_Credential_Type; ...    Cred.Set_Application_Identifier ("todo­app");    Cred.Set_Application_Secret ("todo­app­secret");    Cred.Set_Provider_URI ("http://localhost:8080/v1/oauth/token");    Cred.Request_Token (Username, Password, "read:todo write:todo"); ...    Client.Set_Credentials (Cred’Access);
  • 29. https://github.com/stcarrez/swagger-ada 29 Client Security with OAuth2 (2/2) ● Make API calls: credentials are passed on the wire within the ‘Authorization’ header List : Todos.Models.Todo_Type_Vectors.Vector; ...    Client.List_Todos (Empty, List); GET /v1/todos HTTP/1.1 Host: localhost:8080 Authorization: Bearer 74rE0wU.d44CPAll_kyyB2krd8bYdVYWqgmtloIR.9zyiBM Accept: application/json
  • 30. https://github.com/stcarrez/swagger-ada 30 Server security (1/2) ● Each OpenAPI scope represented by a permission definition (generated code): ● Authentication and permission check generated in the server skeleton (generated code): if not Context.Is_Authenticated then    Context.Set_Error (401, "Not authenticated");    return; end if; if not Context.Has_Permission (ACL_Read_Todo.Permission) then    Context.Set_Error (403, "Permission denied");    return; end if; package ACL_Read_Todo    is new Security.Permissions.Definition ("read:todo");
  • 31. https://github.com/stcarrez/swagger-ada 31 Server security (2/2) ● Configure the server key for OAuth2 tokens: ● Configure the server to register the client id and secret ● Configure the users allowed to authenticate app.list=1 app.1.client_id=todo­app app.1.client_secret=todo­app­secret app.1.scope=none users.list=1,2 users.1.username=admin users.1.password=admin users.2.username=test users.2.password=test swagger.key=Y29naGk5SGkKUG9YaTdhaHgKYWlUaGllM3UK
  • 35. https://github.com/stcarrez/swagger-ada 35 Demo: Running the client Server not started 404 error received
  • 36. https://github.com/stcarrez/swagger-ada 36 Limitations and improvements ● Ada Strings (need a lot of To_String/To_Ustring conversions) ● Enums are treated as strings ● Circular type dependencies not handled ● Error model needs some work ● Improvements: – Upload file support – Asynchronous client operation call
  • 37. https://github.com/stcarrez/swagger-ada 37 Conclusion ● OpenAPI describes REST APIs ● Swagger Codegen generates Ada code for you ● Swagger Ada is a runtime library for REST client and REST server implementation ● More than 500 APIs available, write your own! ● Next step: … GraphQL?