Automatiseer het genereren van dynamische mock API-data met variabele parameters
description
Met deze prompt kan ik een flexibele mock API ontwerpen die automatisch variabele en conditionele data genereert, waardoor ik mijn applicaties kan testen met realistische scenario's zonder steeds handmatig data aan te passen. Dit verhoogt de testefficiëntie en betrouwbaarheid aanzienlijk ten opzichte van statische mock data.
prompt
try_prompt
Help me een mock API te maken die dynamisch gegenereerde data retourneert gebaseerd op variabele parameters. API-doel: <beschrijf het doel van de API>. Endpoints: <specificeer de benodigde endpoints>. Variabele ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder geef ik een voorbeeld van hoe je een mock API kunt maken die dynamisch gegenereerde data retourneert op basis van variabele parameters, inclusief enkele voorbeelden van complexe logica zoals conditionele velden en gegenereerde tijdstempels.
**1. API-structuur en endpoints**
- `/users`: retourneert een lijst van gebruikers, mogelijk gefilterd op parameters zoals leeftijd, status, regio.
- `/users/{id}`: retourneert details van een specifieke gebruiker, inclusief dynamisch gegenereerde velden.
- `/users/{id}/orders`: retourneert een lijst van bestellingen van een gebruiker, met dynamische data zoals orderdatum en status.
**2. Het genereren van data op basis van parameters**
Gebruik bijvoorbeeld een mock server-tool zoals [json-server](https://github.com/typicode/json-server) of een eenvoudige Node.js Express app. Hier geef ik een voorbeeld met Node.js en Express.
**3. Voorbeeld code**
```js
const express = require('express');
const app = express();
const port = 3000;
// Helper functies
function generateUser(id, params) {
const ageOptions = [25, 35, 45, 55];
const statuses = ['active', 'inactive', 'pending'];
const regions = ['NL', 'BE', 'DE', 'FR'];
const age = ageOptions[id % ageOptions.length];
const status = statuses[id % statuses.length];
const regio = regions[id % regions.length];
// Pas data aan op basis van query parameters
if (params.leeftijd && parseInt(params.leeftijd) !== age) {
// Als leeftijd parameter bestaat en niet overeenkomt, pas toe
// (optioneel: filter de gebruiker niet per se, maar wijzig data)
}
// Conditie: bijvoorbeeld, als status 'active', voeg extra velden toe
const user = {
id,
naam: `Gebruiker ${id}`,
leeftijd: age,
regio: regio,
status: status,
// Conditioneel veld
lastLogin: (status === 'active') ? new Date(Date.now() - Math.random() * 1000000000).toISOString() : null,
// Tijdstempel
createdAt: new Date(Date.now() - Math.random() * 10000000000).toISOString(),
};
return user;
}
function generateOrder(orderId, userId) {
const orderDates = [
new Date(Date.now() - 86400000 * 1), // 1 dag geleden
new Date(Date.now() - 86400000 * 7), // 1 week geleden
new Date(Date.now() - 86400000 * 30), // 1 maand geleden
];
const statuses = ['pending', 'shipped', 'delivered'];
const date = orderDates[orderId % orderDates.length];
const status = statuses[orderId % statuses.length];
return {
orderId,
userId,
product: `Product ${orderId}`,
aantal: Math.ceil(Math.random() * 5),
bestelDatum: date.toISOString(),
status,
// Complexe logica: bijvoorbeeld, als 'shipped', voeg tracking info toe
tracking: (status === 'shipped' || status === 'delivered') ? `TRK${orderId}${userId}` : null,
};
}
// Endpoint /users
app.get('/users', (req, res) => {
const { leeftijd, status, regio } = req.query;
const users = [];
for (let i = 1; i <= 10; i++) {
const user = generateUser(i, req.query);
// Filteren op parameters
if (leeftijd && parseInt(leeftijd) !== user.leeftijd) continue;
if (status && status !== user.status) continue;
if (regio && regio !== user.regio) continue;
users.push(user);
}
res.json(users);
});
// Endpoint /users/:id
app.get('/users/:id', (req, res) => {
const id = parseInt(req.params.id);
const user = generateUser(id, req.query);
// Voeg conditionele velden toe
if (user.status === 'inactive') {
user.inactiveReason = 'Gebruiker is inactief';
}
res.json(user);
});
// Endpoint /users/:id/orders
app.get('/users/:id/orders', (req, res) => {
const userId = parseInt(req.params.id);
const orders = [];
const aantalOrders = Math.ceil(Math.random() * 3);
for (let i = 1; i <= aantalOrders; i++) {
const order = generateOrder(i, userId);
// Conditionele velden
if (order.status === 'delivered') {
order.feedback = 'Positief';
}
orders.push(order);
}
res.json(orders);
});
app.listen(port, () => {
console.log(`Mock API draait op http://localhost:${port}`);
});
```
**4. Toepassen van complexe logica**
- **Conditionele velden**: Voeg velden toe afhankelijk van andere data, zoals `lastLogin` alleen als gebruiker actief is.
- **Gegenereerde tijdstempels**: Gebruik `new Date()` en `Date.now()` om realistische datums te genereren, eventueel met variatie.
- **Parameters gebruiken voor filtering**: Filter data op basis van query parameters.
- **Variabele data genereren**: Gebruik modulo (`%`) of willekeurige functies om variatie te creëren.
**Samenvatting**
Met bovenstaande aanpak kun je een mock API maken die dynamisch data produceert gebaseerd op request parameters, met complexe logica zoals conditionele velden en tijdstempels. Je kunt de code aanpassen en uitbreiden afhankelijk van je specifieke wensen voor de productcatalogus of andere datamodellen.
provider: deepseek
model: deepseek-chat
Zeker, ik help je met het opzetten van een mock API met dynamische data. Hier is een complete oplossing met Express.js:
## 1. Eerst de basisopzet
```bash
npm init -y
npm install express faker lodash
```
## 2. Server opzetten (server.js)
```javascript
const express = require('express');
const faker = require('faker');
const _ = require('lodash');
const app = express();
const port = 3000;
app.use(express.json());
// Dynamische data generator
const generateUserData = (params = {}) => {
const age = params.leeftijd || faker.datatype.number({min: 18, max: 80});
const status = params.status || faker.helpers.randomize(['actief', 'inactief', 'pending']);
const region = params.regio || faker.helpers.randomize(['noord', 'oost', 'zuid', 'west']);
return {
id: faker.datatype.uuid(),
naam: faker.name.findName(),
email: faker.internet.email(),
leeftijd: age,
status: status,
regio: region,
// Conditioneel veld gebaseerd op leeftijd
leeftijdsCategorie: age < 30 ? 'jong' : age < 60 ? 'volwassen' : 'senior',
// Gegenereerde tijdstempels
aangemaaktOp: faker.date.past(2),
laatstBijgewerkt: faker.date.recent(),
// Complexe logica: premium status gebaseerd op meerdere voorwaarden
isPremium: status === 'actief' && age > 25 && ['oost', 'west'].includes(region)
};
};
const generateOrderData = (userId, userParams) => {
const stockLevel = faker.datatype.number({min: 0, max: 100});
return {
orderId: faker.datatype.uuid(),
userId: userId,
product: faker.commerce.productName(),
prijs: faker.commerce.price(),
// Dynamische voorraad gebaseerd op parameters
voorraad: stockLevel,
voorraadStatus: stockLevel === 0 ? 'uitverkocht' :
stockLevel < 10 ? 'laag' : 'op_voorraad',
// Tijdstempel met complexe logica
besteldOp: faker.date.recent(),
verwachteLevering: new Date(Date.now() +
(userParams.regio === 'noord' ? 3 : userParams.regio === 'zuid' ? 5 : 2) * 86400000),
// Conditionele velden
heeftSpoedlevering: userParams.leeftijd > 65 || userParams.status === 'premium'
};
};
// Endpoints
app.get('/users', (req, res) => {
const { leeftijd, status, regio } = req.query;
const count = parseInt(req.query.count) || 10;
const users = Array.from({ length: count }, () =>
generateUserData({ leeftijd, status, regio })
);
res.json({
totaal: users.length,
gebruikers: users,
gegenereerdOp: new Date().toISOString()
});
});
app.get('/users/:id', (req, res) => {
const user = generateUserData(req.query);
user.id = req.params.id; // Overschrijf ID met parameter
res.json(user);
});
app.get('/users/:id/orders', (req, res) => {
const orderCount = parseInt(req.query.limit) || 5;
const orders = Array.from({ length: orderCount }, () =>
generateOrderData(req.params.id, req.query)
);
res.json({
userId: req.params.id,
totaalOrders: orders.length,
orders: orders,
laatsteUpdate: new Date().toISOString()
});
});
app.listen(port, () => {
console.log(`Mock API draait op http://localhost:${port}`);
});
```
## 3. Gebruiksvoorbeelden
**Alle gebruikers ophalen met filters:**
```bash
GET /users?leeftijd=30&status=actief®io=west&count=5
```
**Specifieke gebruiker:**
```bash
GET /users/12345?leeftijd=40&status=actief
```
**Orders van gebruiker:**
```bash
GET /users/12345/orders?limit=3®io=noord
```
## 4. Complexe logica voorbeelden
**Conditionele velden:**
```javascript
// In generateUserData:
leeftijdsCategorie: age < 30 ? 'jong' : age < 60 ? 'volwassen' : 'senior',
isPremium: status === 'actief' && age > 25 && ['oost', 'west'].includes(region)
```
**Dynamische tijdstempels:**
```javascript
// In generateOrderData:
verwachteLevering: new Date(Date.now() +
(userParams.regio === 'noord' ? 3 : userParams.regio === 'zuid' ? 5 : 2) * 86400000)
```
**Parameters-based logica:**
```javascript
// Voorraad logica gebaseerd op leeftijd en regio
const stockMultiplier = userParams.leeftijd > 50 ? 0.8 : 1.2;
const regionFactor = userParams.regio === 'zuid' ? 1.5 : 1;
voorraad: Math.floor(stockLevel * stockMultiplier * regionFactor)
```
## 5. Uitbreidingsmogelijkheden
- **Middleware** voor parameter validatie
- **Caching** mechanisme voor consistente data
- **Rate limiting** voor realistische API gedrag
- **Database mock** met localStorage voor persistentie
Start de server met: `node server.js` en test de endpoints met Postman of curl.

