Services
Chart Rendering
Serverseitige PNG-Generierung aus Chart.js-Konfigurationen. Antwort ist image/png
(kein JSON).
Endpoint
/api/chart/render (POST)
{
"type": "line",
"width": 800,
"height": 320,
"background": "#ffffff",
"cornerRadius": 16,
"data": {
"labels": [
"Jan",
"Feb",
"Mrz",
"Apr",
"Mai",
"Jun"
],
"datasets": [
{
"label": "Umsatz",
"data": [
12,
19,
7,
15,
22,
18
],
"borderColor": "#2563eb",
"backgroundColor": "rgba(37,99,235,0.25)",
"fill": false,
"tension": 0.3
}
]
},
"options": {
"responsive": false
}
}
curl -X POST "https://dev.nuvisphere.de/api/chart/render" \
-H "Content-Type: application/json" \
-H "x-api-key: API_KEY"
-d '{
"type": "line",
"width": 800,
"height": 320,
"background": "#ffffff",
"cornerRadius": 16,
"data": {
"labels": [
"Jan",
"Feb",
"Mrz",
"Apr",
"Mai",
"Jun"
],
"datasets": [
{
"label": "Umsatz",
"data": [
12,
19,
7,
15,
22,
18
],
"borderColor": "#2563eb",
"backgroundColor": "rgba(37,99,235,0.25)",
"fill": false,
"tension": 0.3
}
]
},
"options": {
"responsive": false
}
}'
// server-side (Node/Next.js)
const res = await fetch("https://dev.nuvisphere.de/api/chart/render", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": process.env.MAILER_API_KEY!,
},
body: JSON.stringify({
"type": "line",
"width": 800,
"height": 320,
"background": "#ffffff",
"cornerRadius": 16,
"data": {
"labels": [
"Jan",
"Feb",
"Mrz",
"Apr",
"Mai",
"Jun"
],
"datasets": [
{
"label": "Umsatz",
"data": [
12,
19,
7,
15,
22,
18
],
"borderColor": "#2563eb",
"backgroundColor": "rgba(37,99,235,0.25)",
"fill": false,
"tension": 0.3
}
]
},
"options": {
"responsive": false
}
}),
});
if (!res.ok) throw new Error(`Request failed ${res.status}`);
const json = await res.json();
- API Key niemals im Browser verwenden – nur serverseitig (z. B.
process.env.MAILER_API_KEY
). - Lässt du optionale Felder weg, nutzt die API ggf. Template-/Defaultwerte.
Request
- type: string (z. B. line, bar, pie)
- width, height: number (px)
- data: Chart.js Data‑Objekt
- options: Chart.js Options‑Objekt (optional)
- background: string (optional; CSS Farbe)
- dpr|dpi: number (optional; 0.5–4)
- cornerRadius, borderWidth, borderColor (optional)
Response
200 OK
mit Content-Type: image/png
. Beispiel zur Base64‑Weiterverarbeitung:
// Node/Next.js (Server)
const res = await fetch('https://dev.nuvisphere.de/api/chart/render', {
method: 'POST', headers: { 'content-type': 'application/json' },
body: JSON.stringify({
"type": "line",
"width": 800,
"height": 320,
"background": "#ffffff",
"cornerRadius": 16,
"data": {
"labels": [
"Jan",
"Feb",
"Mrz",
"Apr",
"Mai",
"Jun"
],
"datasets": [
{
"label": "Umsatz",
"data": [
12,
19,
7,
15,
22,
18
],
"borderColor": "#2563eb",
"backgroundColor": "rgba(37,99,235,0.25)",
"fill": false,
"tension": 0.3
}
]
},
"options": {
"responsive": false
}
})
});
const ab = await res.arrayBuffer();
const b64 = Buffer.from(ab).toString('base64');
const dataUrl = 'data:image/png;base64,' + b64;
Tipps
- Feste Größe angeben (Breite/Höhe), kein Responsive nötig.
- Abgerundete Kanten via
cornerRadius
.