Migration sans refonte
Si votre produit utilise déjà l’API REST de GIPHY, Heypster a été conçu pour conserver la même mécanique de requêtes : mêmes chemins `/v1`, mêmes paramètres principaux et même forme de réponse. Sur `heypster-gif.com`, la couche compatible est préfixée par `/giphy`.
La bonne stratégie consiste à migrer en deux temps : d’abord remplacer l’hôte et la clé, puis vérifier les champs secondaires et les formats réellement consommés par votre interface.
hôte à remplacer
clé API à remplacer
réécriture lourde
Avant / après
// avant
const API_HOST = 'https://api.giphy.com';
const API_KEY = 'YOUR_GIPHY_API_KEY';
// après
const API_HOST = 'https://heypster-gif.com/giphy';
const API_KEY = 'YOUR_HEYPSTER_API_KEY';
Premier changement à effectuer : remplacez l’hôte GIPHY par `https://heypster-gif.com/giphy`. Les routes sont protégées par le middleware `giphy.apikey` ; si votre couche de compatibilité reproduit GIPHY, gardez le paramètre `api_key`.
Si vous utilisez déjà des clients Heypster natifs, l’en-tête `HEYPSTER-API-KEY` reste accepté. Pour une migration GIPHY sans refactor, conservez néanmoins `api_key`.
// GIPHY
fetch('https://api.giphy.com/v1/gifs/search?api_key=YOUR_GIPHY_API_KEY&q=clap');
// Heypster
fetch('https://heypster-gif.com/giphy/v1/gifs/search?api_key=YOUR_HEYPSTER_API_KEY&q=clap');
| GIPHY | Heypster |
|---|---|
https://api.giphy.com/v1/gifs/search |
https://heypster-gif.com/giphy/v1/gifs/search |
https://api.giphy.com/v1/gifs/trending |
https://heypster-gif.com/giphy/v1/gifs/trending |
https://api.giphy.com/v1/gifs/translate |
https://heypster-gif.com/giphy/v1/gifs/translate |
https://api.giphy.com/v1/gifs/random |
https://heypster-gif.com/giphy/v1/gifs/random |
https://api.giphy.com/v1/gifs/search/tags |
https://heypster-gif.com/giphy/v1/gifs/search/tags |
https://api.giphy.com/v1/gifs/categories |
https://heypster-gif.com/giphy/v1/gifs/categories |
https://api.giphy.com/v1/tags/related/{term} |
https://heypster-gif.com/giphy/v1/tags/related/{term} |
https://api.giphy.com/v1/trending/searches |
https://heypster-gif.com/giphy/v1/trending/searches |
https://api.giphy.com/v1/randomid |
https://heypster-gif.com/giphy/v1/randomid |
https://api.giphy.com/v1/emoji |
https://heypster-gif.com/giphy/v1/emoji |
https://api.giphy.com/v2/emoji |
https://heypster-gif.com/giphy/v2/emoji |
https://api.giphy.com/v2/emoji/{emoji_id}/variations |
https://heypster-gif.com/giphy/v2/emoji/{emoji_id}/variations |
https://api.giphy.com/v1/gifs/{id} |
https://heypster-gif.com/giphy/v1/gifs/{id} |
https://api.giphy.com/v1/gifs?ids=... |
https://heypster-gif.com/giphy/v1/gifs?ids=... |
api_key
Conservez le même nom de paramètre pour une migration drop-in. Les clients Heypster natifs peuvent aussi utiliser `HEYPSTER-API-KEY`.
q, limit, offset, lang
Ce sont les paramètres principaux réellement pris en charge sur les endpoints de recherche et de listing.
ids
La résolution multi-ID peut rester inchangée si votre code utilise déjà une liste séparée par des virgules.
term
L’endpoint `/giphy/v1/tags/related/{term}` ajoute un paramètre de chemin explicite pour les tags liés.
emoji_id
Les variations d’emoji sont servies via `/giphy/v2/emoji/{emoji_id}/variations` ; les collections d’emoji acceptent aussi `q`, `limit` et `offset`.
rating / weirdness / bundle / fields
Auditez ces paramètres si votre client les envoie : ils ne font pas partie du noyau de compatibilité actuellement pris en charge.
const payload = await response.json();
const items = Array.isArray(payload.data) ? payload.data : [payload.data].filter(Boolean);
const nextOffset = payload.pagination?.offset ?? null;
const requestStatus = payload.meta?.status;
const API_HOST = 'https://heypster-gif.com/giphy';
const API_KEY = 'YOUR_HEYPSTER_API_KEY';
export async function searchReactionGifs(query, offset = 0) {
const url = new URL(`${API_HOST}/v1/gifs/search`);
url.searchParams.set('api_key', API_KEY);
url.searchParams.set('q', query);
url.searchParams.set('limit', '24');
url.searchParams.set('offset', String(offset));
url.searchParams.set('lang', 'fr');
const response = await fetch(url.toString());
const payload = await response.json();
return {
items: payload.data,
pagination: payload.pagination,
meta: payload.meta,
};
}
// Exemples d'autres endpoints mappés
fetch(`${API_HOST}/v1/gifs/categories?api_key=${API_KEY}`);
fetch(`${API_HOST}/v1/tags/related/party?api_key=${API_KEY}`);
fetch(`${API_HOST}/v1/randomid?api_key=${API_KEY}`);
fetch(`${API_HOST}/v2/emoji/1/variations?api_key=${API_KEY}`);