Building APIs with the OpenApi Spec

Pedro J. Molina
Pedro J. MolinaFounder at Metadev en Metadev
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Building APIs
with the OpenAPI Spec
Dr. Pedro J. Molina
CEO at Metadev @pmolinam
MAD · NOV 24-25 · 2017
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
What’s common here?
Library 1
Library 2
Shop N
Service 1
Service 2
Service N
mLab
SendGrid
Plugin N
API
API
API
Ecosystems
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Pedro J. Molina
@pmolinam
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Agenda
 API Economy
 OpenAPI
 User Cases
 Versioning
 Future
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Application Programmer Interface
Services ready for 3er parties to
consume
Technical Description (dev. oriented)
Promotes system integration by
clear contracts durable in time
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
API Economy
APIs define plataforms.
Twitter, Twilio, Google Maps as API samples.
You can’t win without an ecosystem.
You can’t have an ecosystem without an API.
First one take it all  market share
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
API
API as a contract with customers
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Language agnostic APIs
1. CORBA >> C + IDL
2. SOA >> XML + SOAP + WDSL …
3. REST >> JSON + HTTP
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
OpenAPI Initiative
 De facto standard (previously: Swagger)
 Linux Foundation https://www.openapis.org
 Formal contract description for a REST API useful for both
humans and machines.
 Contract described in JSON or YAML
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
OpenAPI Initiative
Tooling
 Editor http://editor.swagger.io
 API Explorer http://petstore.swagger.io
 Validator
https://online.swagger.io/validator
Opensource Generators:
 skeletons for back-ends
 proxies for front-end
http://swagger.io/swagger-codegen
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Use cases
1. Legacy API
2. Contract First
3. Service driven
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
1. Legacy API
Document an existing API
Contract creation http://editor.swagger.io
Validation
Results:
 API docs
 SDK generation for clients
API
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
1. Legacy API. Sample
Is Nieves a girl’s or boy’s name?
Web service to discover it:
http://www.jerolba.com/mujeres-y-hombres-y-serverless
GET https://us-central1-hombre-o-mujer.cloudfunctions.net/gender?name=nieves
Credits to: Jerónimo López @jerolba
API
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
swagger: '2.0'
info:
version: "1.0.0"
title: Girl or boy.
host: us-central1-hombre-o-mujer.cloudfunctions.net
schemes:
- https
consumes:
- application/json
produces:
- application/json
tags:
- name: Gender
description: Frequency name based API to guest gender.
1. Legacy API. Contract
API
http://bit.ly/gender-swagger
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
paths:
/gender:
get:
description: |
Returns the probability base on gender frequency on registed names in Spain.
parameters:
- name: name
in: query
description: Given name
required: true
type: string
responses:
# Response code
200:
description: Sucessful response
schema:
$ref: "#/definitions/GenderResponse"
404:
description: Not found
schema:
$ref: "#/definitions/GenderNotFoundResponse"
1. Legacy API. Contract
API
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
totalMale:
type: number
format: int32
totalFemale:
type: number
format: int32
GenderNotFoundResponse:
required:
- name
- gender
properties:
name:
type: string
gender:
type: string
definitions:
GenderResponse:
required:
- name
- gender
- probability
- totalMale
- totalFemale
properties:
name:
type: string
gender:
type: string
probability:
type: number
format: float
1. Legacy API. Contract
API
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
2. Contract First
Spec is written in first place
http://editor.swagger.io
Can generate:
 a skeleton for backend
 a proxy or SDK for consumers
 enables parallel work on backend and frontend teams.
 contract change can be versioned in a proper way.
API Client
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
2. Contract First. Available server stacks
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
2. Contract First. Available front-end stacks
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Swagger/code-gen
Migrating from spec v.2 to v.3
Book about how to extend swagger/code-gen for your
language/stack:
http://bit.ly/codegen101
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
3. Service Driven
 The Service defines the contract
 The OpenAPI spec is generated by a library using reflection over the
service.
 Requires taking special care to NOT TO break the API compatibility.
 Sample: https://openapi3.herokuapp.com
 Source: https://github.com/pjmolina/event-backend
API Client
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Resources
Maintainer of:
 baucis-swagger2 Generates v.2 contracts for Baucis backends
 https://www.npmjs.com/package/baucis-swagger2
 baucis-openapi3 Generates v.3 contracts for Baucis backends
 https://www.npmjs.com/package/baucis-openapi3
 openapi3-ts TypeScript library for building OpenAPI3 documents
 https://www.npmjs.com/package/openapi3-ts
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
API Management Tools
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
API Management Tools
Examples
3scale
Apigee
Mashape Kong
CA 7Layers
Azure API Management
IBM Bluemix API
Management
WSO
 Provides an extra layer in front of your API
 Managed by 3er parties (externalized)
Main features:
 Authentication, Authorization
 Role-based security
 DOS attack protection
 Monetization: pay per use
 Scaling
 Auditing
 Usage metrics, analytics
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
API Versioning
 Versioning via URL
Versioning via parameter
Versioning via headers
GET /v1/restaurants?location=SVQ
GET /v2/restaurants?location=SVQ&limit=30
GET /restaurants?location=SVQ&limit=30&v=2
GET /restaurants?location=SVQ&limit=30
Version: 2
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
API Scalability
 Stateless API
 Load-balancer to handle traffic
(e.g. nginx or ha-proxy)
 Distributes traffic to your API
servers
 DNS, SSL and certs. configured in
the load balancer
api
lb api
api
#0
#1
#2
443
80
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Summing up
 OpenAPI is a de-facto standard to manage
APIs
 Simplifies consumption and API integration
 Version 3.0 released in June 2017
Roadmap:
 Swagger-codegen porting from v.2 to v.3
(work in progress)
 Convergence with Google gRPC
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Questions?
@pmolinam
1 Q = 1 sticker
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Thx!
@pmolinam
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
Extra bonus
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
REST
 REpresentational State Transfer
 Stateless Protocol
 Unique URIs per resource
 Semantic attached to operations/verbs
 GET/PUT/POST/DELETE over HTTP
Hypermedia (navigable)
GET /actors/42
Accept: application/json
200 OK
Content-Type: application/json
{ "id": 42
"name": "Jessica"
"lastname": "Alba"
"filmography": "/films/42"
}
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
MIME Types
 Declares encoding
Most frequents are:
 JSON application/json
 XML text/xml
 HTML text/html
 Plain text text/plain
 CSV text/csv
GET /actors/42
Accept: text/xml
200 OK
Content-Type: text/xml
<actor id="42">
<name>Jessica</name>
<lastname>Alba</lastname>
<filmography
url= "/films/42" />
</actor>
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
REST Levels
Richarson Maturity Model
http://martinfowler.com/articles/richardsonMaturityModel.html
Level 0. HTTP and nothing else (RPC under HTTP)
Level 1. Resources GET /invoice/217
Level 2. Using the semantinc of verbs and HTTP error codes POST /invoice/  201 Created
https://i.stack.imgur.com/whhD1.png
https://httpstatuses.com
Level 3. Hypermedia Controls <link rel=“lines”
uri=“/factura/217/lineas”/>
Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
HAL
{
“id”: 1234
“name”: “Alice in Wonderland”
“_links”: {
“self”: { “href”: “/book/10”},
“prev”: { “href”: “/book/9”},
“next”: { “href”: “/book/11”},
“action-delete”: {
“verb”: “DELETE”,
“href”: “/book/10”
}
}
}
://
1 de 35

Recomendados

OpenAPI development with PythonOpenAPI development with Python
OpenAPI development with PythonTakuro Wada
31.6K vistas40 diapositivas
OpenAPI Intro (1).pdfOpenAPI Intro (1).pdf
OpenAPI Intro (1).pdfPostman
246 vistas15 diapositivas
Introducing OpenAPI Version 3.1Introducing OpenAPI Version 3.1
Introducing OpenAPI Version 3.1SmartBear
876 vistas15 diapositivas
API Test Automation API Test Automation
API Test Automation SQALab
1.9K vistas26 diapositivas

Más contenido relacionado

Similar a Building APIs with the OpenApi Spec(20)

SVQdotNET: Building APIs with OpenApiSVQdotNET: Building APIs with OpenApi
SVQdotNET: Building APIs with OpenApi
Juan Luis Guerrero Minero1K vistas
Pivotal + Apigee Workshop (June 4th, 2019)Pivotal + Apigee Workshop (June 4th, 2019)
Pivotal + Apigee Workshop (June 4th, 2019)
Alexandre Roman532 vistas
A Snapshot of API Design Trends In 2019A Snapshot of API Design Trends In 2019
A Snapshot of API Design Trends In 2019
Bill Doerrfeld921 vistas
Manage your Public API Like a ProtocolManage your Public API Like a Protocol
Manage your Public API Like a Protocol
Delyn Simons1.1K vistas

Más de Pedro J. Molina

TerraformTerraform
TerraformPedro J. Molina
5 vistas1 diapositiva
Are Startups for me?Are Startups for me?
Are Startups for me?Pedro J. Molina
465 vistas18 diapositivas
Meow DemoMeow Demo
Meow DemoPedro J. Molina
228 vistas5 diapositivas

Más de Pedro J. Molina(20)

TerraformTerraform
Terraform
Pedro J. Molina5 vistas
Infrastructure as Code with TerraformInfrastructure as Code with Terraform
Infrastructure as Code with Terraform
Pedro J. Molina51 vistas
Are Startups for me?Are Startups for me?
Are Startups for me?
Pedro J. Molina465 vistas
Meow DemoMeow Demo
Meow Demo
Pedro J. Molina228 vistas
Essential as the base for Web DSLsEssential as the base for Web DSLs
Essential as the base for Web DSLs
Pedro J. Molina300 vistas
Esencia de Web ComponentsEsencia de Web Components
Esencia de Web Components
Pedro J. Molina313 vistas
Esencia de web componentsEsencia de web components
Esencia de web components
Pedro J. Molina323 vistas
OpenAPI 3.0.2OpenAPI 3.0.2
OpenAPI 3.0.2
Pedro J. Molina1.3K vistas
QuidQuid
Quid
Pedro J. Molina430 vistas
Securizando por construcción mediante MDESecurizando por construcción mediante MDE
Securizando por construcción mediante MDE
Pedro J. Molina237 vistas
Micro vs Nano (servicios)Micro vs Nano (servicios)
Micro vs Nano (servicios)
Pedro J. Molina2K vistas
Diseño de APIs con OpenAPIDiseño de APIs con OpenAPI
Diseño de APIs con OpenAPI
Pedro J. Molina2.3K vistas
SVQDC 2017 Tecnologías para MicroserviciosSVQDC 2017 Tecnologías para Microservicios
SVQDC 2017 Tecnologías para Microservicios
Pedro J. Molina1.1K vistas
Introducción a AngularIntroducción a Angular
Introducción a Angular
Pedro J. Molina3.2K vistas
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microservicios
Pedro J. Molina3.6K vistas
Microservicios sobre MEAN StackMicroservicios sobre MEAN Stack
Microservicios sobre MEAN Stack
Pedro J. Molina1.7K vistas
Hivepod: Casos de uso en OpenDataHivepod: Casos de uso en OpenData
Hivepod: Casos de uso en OpenData
Pedro J. Molina797 vistas

Building APIs with the OpenApi Spec

  • 1. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Building APIs with the OpenAPI Spec Dr. Pedro J. Molina CEO at Metadev @pmolinam MAD · NOV 24-25 · 2017
  • 2. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam What’s common here? Library 1 Library 2 Shop N Service 1 Service 2 Service N mLab SendGrid Plugin N API API API Ecosystems
  • 3. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Pedro J. Molina @pmolinam
  • 4. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Agenda  API Economy  OpenAPI  User Cases  Versioning  Future
  • 5. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Application Programmer Interface Services ready for 3er parties to consume Technical Description (dev. oriented) Promotes system integration by clear contracts durable in time
  • 6. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam API Economy APIs define plataforms. Twitter, Twilio, Google Maps as API samples. You can’t win without an ecosystem. You can’t have an ecosystem without an API. First one take it all  market share
  • 7. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam API API as a contract with customers
  • 8. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Language agnostic APIs 1. CORBA >> C + IDL 2. SOA >> XML + SOAP + WDSL … 3. REST >> JSON + HTTP
  • 9. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam OpenAPI Initiative  De facto standard (previously: Swagger)  Linux Foundation https://www.openapis.org  Formal contract description for a REST API useful for both humans and machines.  Contract described in JSON or YAML
  • 10. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
  • 11. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam OpenAPI Initiative Tooling  Editor http://editor.swagger.io  API Explorer http://petstore.swagger.io  Validator https://online.swagger.io/validator Opensource Generators:  skeletons for back-ends  proxies for front-end http://swagger.io/swagger-codegen
  • 12. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Use cases 1. Legacy API 2. Contract First 3. Service driven
  • 13. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam 1. Legacy API Document an existing API Contract creation http://editor.swagger.io Validation Results:  API docs  SDK generation for clients API
  • 14. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam 1. Legacy API. Sample Is Nieves a girl’s or boy’s name? Web service to discover it: http://www.jerolba.com/mujeres-y-hombres-y-serverless GET https://us-central1-hombre-o-mujer.cloudfunctions.net/gender?name=nieves Credits to: Jerónimo López @jerolba API
  • 15. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam swagger: '2.0' info: version: "1.0.0" title: Girl or boy. host: us-central1-hombre-o-mujer.cloudfunctions.net schemes: - https consumes: - application/json produces: - application/json tags: - name: Gender description: Frequency name based API to guest gender. 1. Legacy API. Contract API http://bit.ly/gender-swagger
  • 16. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam paths: /gender: get: description: | Returns the probability base on gender frequency on registed names in Spain. parameters: - name: name in: query description: Given name required: true type: string responses: # Response code 200: description: Sucessful response schema: $ref: "#/definitions/GenderResponse" 404: description: Not found schema: $ref: "#/definitions/GenderNotFoundResponse" 1. Legacy API. Contract API
  • 17. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam totalMale: type: number format: int32 totalFemale: type: number format: int32 GenderNotFoundResponse: required: - name - gender properties: name: type: string gender: type: string definitions: GenderResponse: required: - name - gender - probability - totalMale - totalFemale properties: name: type: string gender: type: string probability: type: number format: float 1. Legacy API. Contract API
  • 18. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam 2. Contract First Spec is written in first place http://editor.swagger.io Can generate:  a skeleton for backend  a proxy or SDK for consumers  enables parallel work on backend and frontend teams.  contract change can be versioned in a proper way. API Client
  • 19. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam 2. Contract First. Available server stacks
  • 20. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam 2. Contract First. Available front-end stacks
  • 21. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Swagger/code-gen Migrating from spec v.2 to v.3 Book about how to extend swagger/code-gen for your language/stack: http://bit.ly/codegen101
  • 22. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam 3. Service Driven  The Service defines the contract  The OpenAPI spec is generated by a library using reflection over the service.  Requires taking special care to NOT TO break the API compatibility.  Sample: https://openapi3.herokuapp.com  Source: https://github.com/pjmolina/event-backend API Client
  • 23. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Resources Maintainer of:  baucis-swagger2 Generates v.2 contracts for Baucis backends  https://www.npmjs.com/package/baucis-swagger2  baucis-openapi3 Generates v.3 contracts for Baucis backends  https://www.npmjs.com/package/baucis-openapi3  openapi3-ts TypeScript library for building OpenAPI3 documents  https://www.npmjs.com/package/openapi3-ts
  • 24. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam API Management Tools
  • 25. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam API Management Tools Examples 3scale Apigee Mashape Kong CA 7Layers Azure API Management IBM Bluemix API Management WSO  Provides an extra layer in front of your API  Managed by 3er parties (externalized) Main features:  Authentication, Authorization  Role-based security  DOS attack protection  Monetization: pay per use  Scaling  Auditing  Usage metrics, analytics
  • 26. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam API Versioning  Versioning via URL Versioning via parameter Versioning via headers GET /v1/restaurants?location=SVQ GET /v2/restaurants?location=SVQ&limit=30 GET /restaurants?location=SVQ&limit=30&v=2 GET /restaurants?location=SVQ&limit=30 Version: 2
  • 27. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam API Scalability  Stateless API  Load-balancer to handle traffic (e.g. nginx or ha-proxy)  Distributes traffic to your API servers  DNS, SSL and certs. configured in the load balancer api lb api api #0 #1 #2 443 80
  • 28. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Summing up  OpenAPI is a de-facto standard to manage APIs  Simplifies consumption and API integration  Version 3.0 released in June 2017 Roadmap:  Swagger-codegen porting from v.2 to v.3 (work in progress)  Convergence with Google gRPC Pedro J. Molina · Building APIs with OpenAPI · @pmolinam
  • 29. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Questions? @pmolinam 1 Q = 1 sticker
  • 30. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Thx! @pmolinam
  • 31. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam Extra bonus
  • 32. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam REST  REpresentational State Transfer  Stateless Protocol  Unique URIs per resource  Semantic attached to operations/verbs  GET/PUT/POST/DELETE over HTTP Hypermedia (navigable) GET /actors/42 Accept: application/json 200 OK Content-Type: application/json { "id": 42 "name": "Jessica" "lastname": "Alba" "filmography": "/films/42" }
  • 33. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam MIME Types  Declares encoding Most frequents are:  JSON application/json  XML text/xml  HTML text/html  Plain text text/plain  CSV text/csv GET /actors/42 Accept: text/xml 200 OK Content-Type: text/xml <actor id="42"> <name>Jessica</name> <lastname>Alba</lastname> <filmography url= "/films/42" /> </actor>
  • 34. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam REST Levels Richarson Maturity Model http://martinfowler.com/articles/richardsonMaturityModel.html Level 0. HTTP and nothing else (RPC under HTTP) Level 1. Resources GET /invoice/217 Level 2. Using the semantinc of verbs and HTTP error codes POST /invoice/  201 Created https://i.stack.imgur.com/whhD1.png https://httpstatuses.com Level 3. Hypermedia Controls <link rel=“lines” uri=“/factura/217/lineas”/>
  • 35. Pedro J. Molina · Building APIs with OpenAPI · @pmolinam HAL { “id”: 1234 “name”: “Alice in Wonderland” “_links”: { “self”: { “href”: “/book/10”}, “prev”: { “href”: “/book/9”}, “next”: { “href”: “/book/11”}, “action-delete”: { “verb”: “DELETE”, “href”: “/book/10” } } } ://