Integreer Sanity CMS met externe API's voor dynamische content
description
Met deze prompt kan de gebruiker leren hoe hij Sanity CMS efficiënt kan koppelen aan externe gegevensbronnen, waardoor content up-to-date blijft zonder handmatige updates. Dit lost het probleem van statische content op en verhoogt de flexibiliteit en functionaliteit van het CMS, beter dan alternatieven die geen real-time synchronisatie bieden.
prompt
Help me met het ontwerpen en implementeren van integraties tussen mijn Sanity CMS-project en externe API's om dynamische content te laden en te synchroniseren. Extern ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk, ik help je graag met het ontwerpen en implementeren van de integratie tussen je Sanity CMS en de OpenWeatherMap API. Hier is een stapsgewijs overzicht en enkele suggesties:
1. Ontwerp van de data-integratie
- Doel: Dynamisch laden en synchroniseren van weergegevens (Temperatuur, neerslagkans en windsterkte) per locatie in Sanity.
- Data-opslag: Maak in Sanity een schema (documenttype) aan, bijvoorbeeld ‘Weergegevens’, met velden voor locatie, temperatuur, neerslagkans, windsterkte en eventueel timestamp.
2. API-gegevens ophalen
- Endpoint: Gebruik de OpenWeatherMap API endpoint voor actuele gegevens, bijvoorbeeld: `https://api.openweathermap.org/data/2.5/weather`
- Parameters: Voeg locatie en API-sleutel toe, bijvoorbeeld: `?q=Amsterdam&appid=JOUW_API_SLEUTEL&units=metric&lang=nl`
- Data-extractie: Haal uit de API-respons de benodigde data:
- Temperatuur: `main.temp`
- Neerslagkans: Dit wordt niet direct gegeven, maar kun je afleiden uit `rain` of `pop` (probability of precipitation) indien beschikbaar.
- Windsterkte: `wind.speed`
3. Automatisering en synchronisatie
- Plan een script (bijvoorbeeld met Node.js) dat periodiek de API aanroept voor elke locatie.
- Bij ophalen: Maak of update documenten in Sanity via de Sanity API (REST of GraphQL).
- Automatisering: Gebruik een scheduler (bijv. cron) of cloud-functies (bijv. Vercel, Netlify functions, AWS Lambda) om periodiek te synchroniseren.
4. Implementatievoorbeeld (simplistisch)
Hier is een schematisch voorbeeld in Node.js:
```javascript
const sanityClient = require('@sanity/client');
const axios = require('axios');
const client = sanityClient({
projectId: 'JOUW_PROJECT_ID',
dataset: 'productie',
token: 'JOUW_SANITY_TOKEN', // nodig voor write-permissies
useCdn: false,
});
const locaties = ['Amsterdam', 'Rotterdam', 'Utrecht']; // voeg je locaties toe
const apiKey = 'JOUW_OPENWEATHERMAP_API_SLEUTEL';
async function fetchWeerData(locatie) {
const url = `https://api.openweathermap.org/data/2.5/weather?q=${locatie}&appid=${apiKey}&units=metric&lang=nl`;
const response = await axios.get(url);
const data = response.data;
return {
locatie,
temperatuur: data.main.temp,
windsterkte: data.wind.speed,
neerslagkans: data.rain ? data.rain['1h'] : 0, // of andere methode
timestamp: new Date().toISOString(),
};
}
async function slaWeerDataOp(weerData) {
await client.createOrReplace({
_type: 'weergegevens',
locatie: weerData.locatie,
temperatuur: weerData.temperatuur,
windsterkte: weerData.windsterkte,
neerslagkans: weerData.neerslagkans,
timestamp: weerData.timestamp,
});
}
async function main() {
for (const locatie of locaties) {
const weerData = await fetchWeerData(locatie);
await slaWeerDataOp(weerData);
}
}
main().catch(console.error);
```
5. Sanity-schema voorbeeld
```js
// schemas/weergegevens.js
export default {
name: 'weergegevens',
title: 'Weergegevens',
type: 'document',
fields: [
{ name: 'locatie', type: 'string' },
{ name: 'temperatuur', type: 'number' },
{ name: 'windsterkte', type: 'number' },
{ name: 'neerslagkans', type: 'number' },
{ name: 'timestamp', type: 'datetime' },
],
};
```
6. Aanvullende tips
- Beperk het aantal API-aanroepen om quota niet te overschrijden.
- Voeg error-handling toe.
- Overweeg caching of het bijhouden van de laatst opgehaalde data.
- Maak een gebruikersvriendelijke interface in Sanity voor het bekijken van de weergegevens.
Wil je hulp met het schrijven van een volledige script, het instellen van de planning, of heb je andere specifieke wensen?
provider: deepseek
model: deepseek-chat
Zeker! Ik help je bij het ontwerpen en implementeren van integratie tussen Sanity CMS en de OpenWeatherMap API. Hier is een stapsgewijze aanpak:
## 1. Sanity Schema Setup
Voeg eerst een nieuw schema toe in Sanity voor weergegevens:
```javascript
// schemas/weather.js
export default {
name: 'weather',
title: 'Weergegevens',
type: 'document',
fields: [
{
name: 'location',
title: 'Locatie',
type: 'string',
description: 'Stad of locatienaam'
},
{
name: 'temperature',
title: 'Temperatuur (°C)',
type: 'number'
},
{
name: 'precipitation',
title: 'Neerslagkans (%)',
type: 'number'
},
{
name: 'windSpeed',
title: 'Windsterkte (m/s)',
type: 'number'
},
{
name: 'lastUpdated',
title: 'Laatst bijgewerkt',
type: 'datetime'
}
]
}
```
## 2. API Integration Script
Maak een server-side script voor data synchronisatie:
```javascript
// scripts/syncWeather.js
import { createClient } from '@sanity/client'
import axios from 'axios'
const sanityClient = createClient({
projectId: 'jouw-project-id',
dataset: 'production',
useCdn: false,
token: 'jouw-sanity-token'
})
const OPENWEATHER_API_KEY = 'jouw-api-sleutel'
const LOCATIONS = ['Amsterdam', 'Rotterdam', 'Utrecht'] // Pas aan naar wens
async function syncWeatherData() {
try {
for (const location of LOCATIONS) {
const response = await axios.get(
`https://api.openweathermap.org/data/2.5/weather?q=${location}&appid=${OPENWEATHER_API_KEY}&units=metric&lang=nl`
)
const weatherData = response.data
// Zoek bestaand weather document voor deze locatie
const existingDoc = await sanityClient.fetch(
`*[_type == "weather" && location == $location][0]`,
{ location }
)
const doc = {
_type: 'weather',
location: location,
temperature: Math.round(weatherData.main.temp),
precipitation: weatherData.rain ? weatherData.rain['1h'] || 0 : 0,
windSpeed: weatherData.wind.speed,
lastUpdated: new Date().toISOString()
}
if (existingDoc) {
// Update bestaand document
await sanityClient
.patch(existingDoc._id)
.set(doc)
.commit()
} else {
// Maak nieuw document
await sanityClient.create(doc)
}
console.log(`Weergegevens voor ${location} gesynchroniseerd`)
}
} catch (error) {
console.error('Sync fout:', error.message)
}
}
// Uitvoeren
syncWeatherData()
```
## 3. Automatisatie met Cron Job
Installeer `node-cron` en maak een scheduler:
```javascript
// scripts/weatherScheduler.js
import cron from 'node-cron'
import { syncWeatherData } from './syncWeather.js'
// Voer elke 30 minuten uit
cron.schedule('*/30 * * * *', () => {
console.log('Weergegevens synchroniseren...')
syncWeatherData()
})
```
## 4. Frontend Integratie
Haal data op in je frontend:
```javascript
// In je frontend component
import { useEffect, useState } from 'react'
import { createClient } from '@sanity/client'
const client = createClient({
projectId: 'jouw-project-id',
dataset: 'production',
useCdn: true
})
function WeatherWidget({ location }) {
const [weather, setWeather] = useState(null)
useEffect(() => {
async function fetchWeather() {
const query = `*[_type == "weather" && location == $location][0]{
temperature,
precipitation,
windSpeed,
lastUpdated
}`
const data = await client.fetch(query, { location })
setWeather(data)
}
fetchWeather()
}, [location])
if (!weather) return <div>Loading...</div>
return (
<div className="weather-widget">
<h3>Weer in {location}</h3>
<p>Temp: {weather.temperature}°C</p>
<p>Neerslag: {weather.precipitation}%</p>
<p>Wind: {weather.windSpeed} m/s</p>
</div>
)
}
```
## 5. Environment Variables
Maak een `.env` bestand:
```
SANITY_PROJECT_ID=jouw-project-id
SANITY_DATASET=production
SANITY_TOKEN=jouw-sanity-token
OPENWEATHER_API_KEY=jouw-openweather-api-sleutel
```
## 6. Package.json Scripts
```json
{
"scripts": {
"sync-weather": "node scripts/syncWeather.js",
"start-scheduler": "node scripts/weatherScheduler.js"
}
}
```
## Belangrijke Overwegingen:
- **Rate Limiting**: OpenWeatherMap heeft limieten (60 calls/minuut gratis)
- **Error Handling**: Voeg try-catch blocks en retry logic toe
- **Data Freshness**: Stel updatefrequentie in op basis van je behoeften
- **Security**: Bewaar API keys veilig, nooit in client-side code
Wil je dat ik specifieke onderdelen verder uitwerk of heb je vragen over bepaalde implementatiedetails?