OpenAPI, ehemals bekannt als Swagger, ist ein Spezifikationsframework für RESTful APIs. Es ermöglicht eine standardisierte Beschreibung von APIs, wodurch die Entwicklung, Dokumentation, Visualisierung und Client-Server-Generierung vereinfacht werden. Die OpenAPI-Spezifikation definiert ein standardisiertes Interface, um RESTful APIs zu beschreiben, unabhängig von der Programmiersprache.
Der OpenAPI-Generator ist ein leistungsfähiges Tool, das aus OpenAPI-Spezifikationen Code in verschiedenen Programmiersprachen generiert. Dies automatisiert die Erstellung von API-Clientbibliotheken, Server-Stubs, API-Dokumentationen und anderen Komponenten.
Für Projekte, die TypeScript mit Node.js verwenden, bietet der OpenAPI-Generator die Möglichkeit, Client-Bibliotheken, Server-Stubs und andere nützliche Komponenten direkt aus einer OpenAPI-Spezifikation zu generieren. Dies spart erheblich Zeit und reduziert Fehler, die bei der manuellen Codeerstellung auftreten können.
package.json für ein TypeScript-Node-ProjektEin zentraler Bestandteil bei der Entwicklung von Node.js-Anwendungen
ist die package.json Datei. Sie definiert das Projekt und
seine Abhängigkeiten. Im Kontext der Verwendung des OpenAPI-Generators
für ein TypeScript-Node-Projekt könnte die package.json
folgendermaßen aussehen:
{
"name": "my_project",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"generate:api": "openapi-generator-cli generate -g typescript-node -i ./openapi/contract.yaml -o ./build/openapi",
"prebuild": "npm run generate:api",
"build": "./node_modules/.bin/tsc",
"prestart": "npm run build",
"start": "node ./build/src/index.js",
"test": "jest"
},
"author": "",
"license": "ISC",
"devDependencies": {
"@openapitools/openapi-generator-cli": "^2.9.0",
"@types/jest": "^29.5.11",
"@types/lodash": "^4.14.202",
"@types/node": "^20.4.2",
"@types/request": "^2.48.12",
"jest": "^29.7.0",
"ts-jest": "^29.1.2",
"tslint": "^6.1.3",
"typescript": "^5.3.3"
},
"dependencies": {
"lodash": "^4.17.21",
"request": "^2.88.2"
}
}OpenAPI Contracts, auch bekannt als OpenAPI Spezifikationen, sind formale Beschreibungen von RESTful APIs. Sie bieten eine standardisierte Darstellung von API-Endpunkten, Anfragemethoden, Parametern, Antwortstrukturen und anderen wichtigen API-Details. OpenAPI Contracts ermöglichen es, APIs konsistent zu dokumentieren, zu entwickeln und zu testen.
openapi: 3.0.0
info:
title: Benutzer API
description: API für Dummy-Benutzerdaten
version: 1.0.0
paths:
/users:
get:
summary: Benutzer auflisten
responses:
'200':
description: Erfolgreiche Anfrage
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
post:
summary: Neuen Benutzer hinzufügen
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/User'
responses:
'201':
description: Benutzer erfolgreich hinzugefügt
'400':
description: Ungültige Anfrage
/users/{id}:
get:
summary: Benutzer abrufen
parameters:
- name: id
in: path
required: true
description: ID des Benutzers
schema:
type: integer
responses:
'200':
description: Erfolgreiche Anfrage
'404':
description: Benutzer nicht gefunden
put:
summary: Benutzer aktualisieren
parameters:
- name: id
in: path
required: true
description: ID des Benutzers
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/User'
responses:
'200':
description: Benutzer erfolgreich aktualisiert
'404':
description: Benutzer nicht gefunden
delete:
summary: Benutzer löschen
parameters:
- name: id
in: path
required: true
description: ID des Benutzers
schema:
type: integer
responses:
'204':
description: Benutzer erfolgreich gelöscht
'404':
description: Benutzer nicht gefunden
components:
schemas:
User:
type: object
properties:
id:
type: integer
name:
type: string
email:
type: string
username:
type: string
website:
type: stringDieser Contract beschreibt eine API zur Verwaltung von Benutzerdaten. Nachfolgend wird erläutert, wie dieser Contract mit dem OpenAPI-Generator genutzt werden kann, um TypeScript-Node-Client-Code zu generieren.
Nachdem der OpenAPI-Generator verwendet wurde, um aus dem Benutzer-API-Contract TypeScript-Node-Code zu erzeugen, kann dieser Code für die Interaktion mit der API genutzt werden. Hier ist ein Beispiel für die Nutzung des generierten Codes:
import { DefaultApi } from '../build/openapi/api/defaultApi';
import { User } from '../build/openapi/model/user';DefaultApi ist das generierte Modul, das die
API-Endpunkte beinhaltet.User ist das generierte Modell, das die Struktur eines
Benutzerobjekts repräsentiert.const api = new DefaultApi('http://localhost:3000');DefaultApi erstellt, wobei
die Basis-URL der API angegeben wird.api.usersGet()
.then((response: { body: User[]; }) => {
const users: Array<User> = response.body;
console.log('Liste der Benutzer:', users);
})
.catch((error: any) => {
console.error('Fehler beim Abrufen der Benutzer:', error);
});api.usersGet(): Ruft die GET /users
Methode auf, um Benutzerdaten abzurufen..then(...): Bei Erfolg werden die abgerufenen
Benutzerdaten verarbeitet. response.body enthält das Array
von User-Objekten..catch(...): Bei einem Fehler wird dieser gefangen und
ausgegeben.Dieses Beispiel zeigt, wie der generierte Client verwendet wird, um Benutzerdaten von der API abzurufen. Es demonstriert die einfache Integration und Nutzung der generierten API-Clients in einer TypeScript-Node-Anwendung. Im nächsten Schritt könnten weitere Funktionen wie das Hinzufügen, Aktualisieren oder Löschen von Benutzerdaten implementiert werden.
Um einen Server Mock für das Testen der Benutzer API zu erstellen,
wird eine Kombination aus einer Daten-Datei und dem Tool
json-server verwendet.
db.jsonDie db.json-Datei dient als Datenquelle für den
Mock-Server. Sie enthält ein JSON-Objekt, das die Benutzerdaten in einem
Array speichert. Hier ein Beispiel:
{
"users": [
{
"id": 1,
"name": "Max Mustermann",
"email": "max@example.com",
"username": "maxm",
"website": "www.max-mustermann.com"
},
{
"id": 2,
"name": "Anna Schmidt",
"email": "anna@example.com",
"username": "annas",
"website": "www.anna-schmidt.net"
},
{
"id": 3,
"name": "Peter Müller",
"email": "peter@example.com",
"username": "peterm",
"website": "www.peter-mueller.org"
},
{
"id": 4,
"name": "Linda Wagner",
"email": "linda@example.com",
"username": "lindaw",
"website": "www.linda-wagner.de"
},
{
"id": 5,
"name": "Tom Becker",
"email": "tom@example.com",
"username": "tomb",
"website": "www.tom-becker.eu"
},
{
"id": 6,
"name": "Sophia Klein",
"email": "sophia@example.com",
"username": "sophiak",
"website": "www.sophia-klein.info"
},
{
"id": 7,
"name": "Jan Hartmann",
"email": "jan@example.com",
"username": "janh",
"website": "www.jan-hartmann.at"
},
{
"id": 8,
"name": "Sarah Berger",
"email": "sarah@example.com",
"username": "sarahb",
"website": "www.sarah-berger.ch"
},
{
"id": 9,
"name": "Markus Fischer",
"email": "markus@example.com",
"username": "markusf",
"website": "www.markus-fischer.nl"
},
{
"id": 10,
"name": "Lisa Lehmann",
"email": "lisa@example.com",
"username": "lisal",
"website": "www.lisa-lehmann.be"
}
]
}json-server zum Erstellen des Mock-Serversjson-server ist ein NPM-Tool, das eine vollständige Fake
REST API mit minimaler Einrichtung schnell simuliert. Der folgende
Befehl wird verwendet, um json-server zu starten und die
db.json-Datei zu überwachen:
npx json-server --watch db.jsonnpx: Führt ein NPM-Paket aus, ohne es global
installieren zu müssen.json-server: Das NPM-Paket, das als Mock-Server
dient.--watch db.json: Instruktion an
json-server, die db.json-Datei zu überwachen
und Änderungen in Echtzeit zu reflektieren.Nach Ausführung des Befehls wird json-server:
db.json-Datei
erstellen. Zum Beispiel wird /users für das Array von
Benutzerobjekten verfügbar sein.Durch den Einsatz dieses Mock-Servers können Entwickler:
In weiteren Schritten könnte die Integration des Mock-Servers in automatisierte Tests oder die Einbindung in eine Continuous Integration/Continuous Deployment (CI/CD) Pipeline betrachtet werden.