A step by step guide to documenting & hosting your application APIs with Swagger
.
While it is possible to do so using Swagger on-line editor
and SwaggerHub
this guide shows how to create you openAPI
documentation locally and host it as part of your application.
Swagger
or openAPI
is the a set of the design and documentation tools for creating the openAPI
Specification for your application.
For more information about Swagger
visit: https://swagger.io/ website.
This tutorial assumes that you are using Atom IDE
and have Node js
isntalled globally.
Create a new GitHub repo and copy its address. Then go to your projects directory at command prompt and clone your new repo. This creates your new project directory locally, eg.
git clone https://github.com/CriptoGirl/myFullStackAppDocs.git
Create .gitignore file in the project directory as following:
*node_modules/
Create a project folder, e.g. myProjectDocs
in your Projects
directory.
Go to this directory and create a new node.js
package by running the following command at the command prompt:
npm init
Express is a lightweight web application framework for Node.js, which provides a robust set of features for writing web apps. These features include route handling, template engine integration and a middleware framework. Type following command at the command line:
npm install --save express npm install swagger-jsdoc --save npm install swagger-ui-express --save npm install --save-dev nodemon
--save option, adds the library to the dependencies section of the package.json
file.
In your application folder create index.js
file, then add the following code to it:
const app = require('./startup/app'); const server = app.listen(process.env.PORT || 5000, () => { console.log(`Express is running on port ${server.address().port}`); });
Create startup
folder under the server
folder and add app.js
file to it containing the following code:
// libraries const express = require('express'); const app = express(); const swaggerJSDoc = require('swagger-jsdoc'); const swaggerUi = require('swagger-ui-express'); // options for the swagger doc const swaggerDefinition = { openapi: '3.0.0', info: { version: '1.0.0', // Version of the app license: { name: 'MIT', url: 'https://spdx.org/licenses/MIT.html' } }, servers: [ {url: 'http://localhost:5002/', description: 'Localhost'}, {url: 'https://sampleservices.com:5002/', description: 'Staging server for testing'} ], components: { securitySchemes: { bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' } } }, security: { bearerAuth: [] } } // customize for System Data API swaggerDefinition.info.title = 'Sample System Data API' let options = { swaggerDefinition, apis: ['./swaggerDocs/systemData.yaml'] } // generate swagger document const swaggerDocument = swaggerJSDoc(options); // routes: use swagger-Ui-express for your app documentation endpoint app.use('/', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); // module.exports = app;
At command prompt, go to the server
folder and type the following command to start the Server:
nodemon
This should start the Server.
Test navigation in a browser.
At command prompt go to the project directory and execute following commands to commit your local code to GitHub:
git add . git commit -m "server code" git push
Open up the Atom Preferences
, and navigate to the Install tab
. This is where you install Atom Packages
.
In the Install tab
, enter swagger
in the search box. The results will include a package named linter-swagger
and another for linter-swagger-improved
.
Install linter-swagger
and install linter
as well.
Once you've done that, you can edit an OpenAPI
specification directly in Atom
. It will interactively warn of problems with the code. That's great, and it's just as useful as in the Swagger Editor
. But, it doesn't have that nice browsing of the API like you get in the Swagger Editor
. The advantage is that you're in a real programmers editor, with direct access to files on your filesystem.
For more information see: https://techsparx.com/software-development/openapi/edit-swagger-api-documents.html website where I have got the above instructions.
Create swaggerDocs
directory under your project folder.
Than, create sample.yaml
file in the above directory, containing:
paths: /countries/: # path of the user from your endpoint get: tags: ['System Data: countries'] summary: Returns a list of all countries. security: - bearerAuth: [] responses: 200: # status code description: A list of Countries content: application/json: schema: type: array items: $ref: "#/components/schemas/Country" 403: description: Not authorised. 500: description: An unexpected error occured. tries: post: tags: ['System Data: countries'] summary: Creates a country. security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - code - name properties: code: type: string description: 2 char country code. name: type: string description: Country name. status: type: string enum: ["Current", "Not in use"] description: Country status code. example: code: "GB" name: "United Kingdom" status: "Current" responses: 201: description: "Country added. Code: {{countrycode}}." 403: description: Not authorised. 422: description: Unprocessable Entity. 500: description: An unexpected error occured. put: tags: ['System Data: countries'] summary: Update country. security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - code - name properties: code: type: string description: 2 char country code. name: type: string description: Country name. status: type: string enum: ["Current", "Not in use"] description: Country status code. example: code: "GB" name: "United Kingdom" status: "Current" responses: 201: description: "Country updated." 403: description: Not authorised. 404: description: Country not found. 422: description: Unprocessable Entity. 500: description: An unexpected error occured. Country could not be updated. /countries/{code}: delete: tags: ['System Data: countries'] summary: Delete country. security: - bearerAuth: [] parameters: - in: path name: code schema: type: string required: true description: Code of the country that needs to be deleted example: 'XX' responses: 201: description: "Country deleted." 403: description: Not authorised. 404: description: Country not found. 422: description: Unprocessable Entity. 500: description: An unexpected error occured. Country could not be updated. components: schemas: Country: type: object required: - code - name - status - createdAt - updatedAt properties: code: type: string description: 2 char country code. example: GB name: type: string description: Country name. example: United Kingdom status: type: string enum: ["Current", "Not in use"] description: Country status code. example: Current createdAt: type: string format: date-time description: Record created at date-time. example: "2020-10-15T17:05:03.000Z" updatedAt: type: string format: date-time description: Record updated at date-time. example: "2020-10-15T17:05:03.000Z"
Test in a browser.
Add static_docs
directory under the server
directory of your project.
Create a directory for each API Documentation File, e.g. system_data
directory under the static_docs
directory.
In your local environment start your Documenation Server.
In a browser right-click on the documentation page and choose Save as...
option. Make sure that you save as type: Web Page, Complete
option. You can save directly to the static_docs
folder in your project.
Rename Swagger UI.html
as index.html
.
Add following to your project's app.js
file:
// serving static swagger pages app.use('/api_docs_system_data', express.static('static_docs/system_data'));
Add call to the new route from your application front end.
Test using your application.
Repeat steps 2.5, 3.1, 3.2 and 3.3 for any new API doc.
Other usefull packages:
npm install @alt3/sequelize-to-json-schemas --save
npm install --save yamljs