API de données

L’API de données retourne les données publiques du blog.

  • Aucune clé API n’est requise.
  • Toutes les réponses sont au format JSON.
  • Tous les points de terminaison utilisent la méthode HTTP GET.
  • Le chemin de base est : https://blogs.hyvor.com/api/data/v0/{subdomain}
  • Par exemple, si votre blog se trouve à https://example.hyvor.com, le chemin de base est https://blogs.hyvor.com/api/data/v0/example
    • Remplacez {subdomain} par le sous-domaine de votre blog.

En plus d'appeler l'API de données via HTTP, il est possible de l'appeler dans les fichiers de modèle en utilisant la fonction Twig data(). C'est la méthode préférée si vous voulez que des données servent à afficher une interface (ex : section des articles récents) dans votre blog, car la fonction data() appelle l'API de données en interne au moment du rendu du modèle, éliminant ainsi le besoin de requêtes HTTP supplémentaires.

Points de terminaison

Objet unique

  • /post - un article/page
  • /tag
  • /author
  • /blog- paramètres du blog

Objets multiples

  • /posts
  • /posts/search - rechercher des articles
  • /tags
  • /authors

Réponse

Pour les points de terminaison à objet unique, la réponse est un objet. Par exemple, le point de terminaison /post retourne un objet Post (voir ci-dessous pour les définitions d’objets).

// A Post Object
{
    "id": 1000,
    "slug": "post",
    ...
}

Pour les points de terminaison à objets multiples, la réponse ressemble à ceci :

{
    "data": [{}, {}], // array of objects
    "pagination": {} // a Pagination object
}

Requête

Points de terminaison à objet unique

Pour /post, /tag, et /author

Paramètre
Description
Type
id
id de l'objet
integer
slug
slug de l'objet
string
language
string
keys
string

Soit l'id, soit le slug est requis pour ces points de terminaison.

Le point de terminaison /blog n’accepte que language et keys en entrée.

Points de terminaison à objets multiples

/posts, /posts/search, /tags, et /authors

Paramètre
Description
Type
Défaut
language
string
limit
integer
25
page
integer
1
filter
string
""
sort
string
[VARIABLE]
keys
string

Le point de terminaison /posts/search a un paramètre search requis en plus des paramètres ci-dessus.

Paramètre
Description
Type
Défaut
search
valeur à rechercher
string

Le point de terminaison /tags dispose d’un paramètre visibility optionnel pour filtrer les étiquettes par visibilité. Notez que les étiquettes privées ne sont pas destinées à être affichées publiquement sur le blog. Elles ne doivent être utilisées qu’à des fins internes (par ex. : afficher/masquer un widget dans le blog si l’étiquette est présente dans l’article).

Paramètre
Description
Type
Défaut
visibility
public - uniquement les étiquettes publiques, private - uniquement les étiquettes privées, any - toutes les étiquettes
string
public

1. Le paramètre language

Si votre blog a plusieurs langues, vous pouvez définir le paramètre language avec un code de langue (ex : en, fr) d’une langue de votre blog. Si ce paramètre n’est pas fourni, la langue principale du blog est utilisée. Cette langue sera utilisée pour localiser les chaînes dans les articles, les auteurs, les étiquettes et le blog.

Remarque : Il existe une distinction importante entre les articles (/post, /posts, et /posts/search) et les autres points de terminaison lors de l'utilisation des langues. Disons que vous avez deux langues dans votre blog : en (principale) et fr. Si vous appelez le point de terminaison /posts avec le code de langue fr, seuls les articles ayant une variante fr seront retournés. Cependant, dans les autres points de terminaison (auteurs, étiquettes), tous les enregistrements seront retournés, qu'ils aient ou non une variante fr. Les traductions manquantes seront complétées par les chaînes de la langue principale. La raison en est que, lorsqu'une personne visite la page d'index /fr de votre blog, nous ne voulons afficher que les articles qui sont traduits en français. Nous ne voulons pas "revenir" au contenu original de l'article. Cependant, revenir aux données auteur/étiquettes est acceptable dans la plupart des cas.

En d'autres termes, language dans les points de terminaison des articles fonctionne comme un filtre, tandis qu'il fonctionne comme un traducteur dans les autres points de terminaison.

2. Le paramètre limit

Le paramètre limit peut être utilisé pour limiter le nombre d’enregistrements retournés dans les points de terminaison à objets multiples. La valeur par défaut est 25. Le maximum est 250.

3. Le paramètre page

Le paramètre page peut être utilisé pour paginer les résultats. Cela fonctionne en combinaison avec le paramètre limit. La valeur par défaut est 1.

To get the first 20 results: /posts?limit=20 To get the next 20 results (page 2):
/posts?limit=20&page=2

4. Le paramètre filter

Exemple : (published_at > 1639665890 & published_at < 1639695890) | is_featured=true

Notre API de données utilise Laravel FilterQ en interne, ce qui vous permet d’écrire une logique avancée comme dans l’exemple ci-dessus, en utilisant des opérateurs de comparaison et logiques.

Une condition se compose de trois parties :

  • key
  • operator
  • value
Opérateurs
  • = - égal à
  • != - différent de
  • > - supérieur à
  • < - inférieur à
  • >= - supérieur ou égal à
  • <= - inférieur ou égal à
Valeurs
  • null
  • booléen : true ou false
  • chaîne de caractères : 'hello' ou hello
    • Les chaînes sans guillemets doivent correspondre à [a-zA-Z_][a-zA-Z0-9_-]+ et ne peuvent pas être true, false, ou null.
  • nombres : 250, -250,2.5
Opérateurs logiques

Vous pouvez utiliser des opérateurs logiques pour combiner plusieurs conditions.

  • | - OU
  • & - ET

Veuillez consulter la documentation FilterQ Expressions si vous avez besoin de plus de détails.

Clés prises en charge pour le filtrage
Point de terminaison
Clé
Opérateurs pris en charge
Type de valeur
Description
/posts
id
tous
integer
published_at
tous
date
Voir Date
updated_at
tous
date
Voir Date
created_at
tous
date
Voir Date
is_featured
=, !=
boolean
slug
=, !=
string
featured_image_url
=, !=
null
uniquement pour vérifier si null ou non
canonical_url
=, !=
string
uniquement pour vérifier si null ou non
words
tous
integer
tag.id
tous
integer
Correspond à l'id des étiquettes de l'article
tag.slug
=, !=
string
Correspond au slug des étiquettes de l'article
author.id
tous
integer
Similaire à tag.id
author.slug
=, !=
string
Similaire à tag.slug
/tags et /authors
id
tous
integer
slug
=, !=
string
post_count
tous
integer
created_at
tous
date
Voir Date
Valeurs de date

Voici quelques valeurs valides pour les clés de date.

  • '2022-01-01'
  • 'yesterday'
  • 'first day of this year'
  • 'last day of next month'
  • '+1 day'
  • '-1 week'
  • 'next Thursday'
  • 1639655890 - Horodatage UNIX

Par exemple : Dans le point de terminaison /posts, vous pouvez utiliser published_at>'-7 days' pour obtenir les articles publiés au cours des 7 derniers jours.

Exemples de filtrage

Notez que lors de l'appel de l'API via HTTP, la valeur du filtre doit être encodée en URL.

Pour obtenir les articles écrits par Alex :

// filter
author.slug=alex

// URL-encoded
/posts?filter=author.slug%3Dalex

Pour obtenir les articles à la une :

// filter
is_featured=true

// URL-encoded
/posts?filter=is_featured%3Dtrue

Pour obtenir les articles ayant l’étiquette audio ou video :

// filter
tag.slug=audio|tag.slug=video

// URL-encoded
/posts?filter=tag.slug%3Daudio%7Ctag.slug%3Dvideo

Pour obtenir les étiquettes ayant au moins 5 articles :

// filter
posts_count>=5

// URL-encoded
/tags?filter=posts_count%3E%3D5

Pour obtenir les auteurs ajoutés après le 1er janvier 2020 :

// filter
created_at>='2020-01-01'

// URL-encoded
/authors?filter=created_at%3E%3D%272020-01-01%27

Pour obtenir les articles publiés au cours des 7 derniers jours.

// filter
published_at>'-7 days'

// URL-encoded
/posts?filter=published_at%3E%27-7%20days%27

5. Le paramètre sort

Voici une liste des valeurs de tri prises en charge. Vous pouvez en combiner plusieurs sous forme de valeurs séparées par des virgules, qui seront alors exécutées dans leur ordre, de manière similaire à ORDER BY en SQL.

Point de terminaison
Tri
Description
/posts Défaut published_at DESC
published_at
Heure de publication de l'article
created_at
Heure de création de l'article
updated_at
Heure de la dernière mise à jour de l'article
id
ID de l'article
is_featured
Considérez ceci comme un entier, 1 pour vrai et 0 pour faux
title
par ordre alphabétique
words
/tags et /authors Défaut posts_count DESC
post_count
nombre d'articles de l'étiquette/auteur
created_at

La méthode de tri par défaut est DESC. Voici quelques exemples pour le paramètre sort.

  • published_at - trié par published_at par ordre décroissant
  • published_at ASC - trié par published_at par ordre croissant
  • is_featured DESC, published_at DESC - les articles à la une en premier, puis triés par heure de publication par ordre décroissant. DESC est optionnel. is_featured, published_at est identique au précédent.

6. Le paramètre keys

Le paramètre keys peut être utilisé pour inclure ou exclure des clés des objets, de manière similaire à GraphQL. Tous les points de terminaison prennent en charge le paramètre keys.

Si vous appelez le point de terminaison /posts, avec keys=id,content, les objets d’article ne contiendront que ces deux clés.

{
    "id": 1000,
    "content": "<p></p>"
}

Utilisez ! au début pour exclure des étiquettes. Par exemple, keys=!content,description exclura content et description de l’objet Post et toutes les autres clés seront incluses.

Disons que vous souhaitez uniquement obtenir l’ID de l’article et l’ID de l’étiquette des articles. Utilisez keys=id,tags.id. Vous obtiendrez des objets comme ceci.

{
    "id": 1000,
    "tags": [
        {
            "id": 2000
        }
    ]
}

Objets

Tous les horodatages sont au format Horodatage Unix (entier).

Objet Post

{
    "id": 1000,

    "created_at": 1639655890,
    "updated_at": 1639655890,
    "published_at": 1639665890,

    "is_featured": false,
    "is_page": false,
    "slug": "hello-world",
    "content": "<p></p>",
    "title": "Hello World",
    "description": "This is a hello world page",
    "url": "https://subdomain.hyvorblogs.io/hello-world",
    "featured_image_url": "https://example.com/image.png",
    "canonical_url": null,
    "words": 500,
    "code_head": "",
    "code_foot": "",

    "language": language object,
    "variants": [ variant objects ],

    "tags": [ tag objects ],
    "tags_private": [ tag objects ],
    "authors": [ author objects ]
}
Clé
Type
Description
id
integer
Un ID unique pour l'article
created_at
integer
Moment où l'article a été créé
updated_at
integer
Le moment où l'article ou ses métadonnées ont été mis à jour
published_at
integer
Heure de publication de l'article
is_featured
boolean
Si l'article est à la une. Il peut y avoir plusieurs articles à la une sur un blog
is_page
boolean
S'il s'agit d'une page. Voir Articles et Pages
slug
string
Le slug d'URL de l'article
url
string
L'URL absolue de l'article, générée en fonction de l'hébergement du blog.
content
string
Le contenu de l'article en HTML. Voir Contenu et l'éditeur pour voir les balises HTML prises en charge
title
string
Le titre de l'article, longueur maximale 256
description
string | null
La description (extrait) de l'article, longueur maximale 350, null si non défini
featured_image_url
string | null
L'URL absolue de l'image mise en avant. null si non défini
canonical_url
string | null
Une URL absolue ou null. L'URL canonique est définie par l'auteur si l'article a été publié ailleurs.
words
integer
Nombre de mots dans le contenu
code_head
string
Code personnalisé à ajouter avant </head>. Une chaîne vide si rien n'est défini.
code_foot
string
Code personnalisé à ajouter avant </body>. Une chaîne vide si rien n'est défini.
language
object
variants
array
Un tableau d'objets Variant
tags
array
Un tableau d'objets Tag publics. L'étiquette principale est à l'index 0
tags_private
array
Un tableau d'objets Tag privés. Voir Étiquettes privées
authors
array
Un tableau d'objets Author. L'auteur principal est à l'index 0

Dans les articles, l'attribut id est unique au niveau mondial dans Hyvor Blogs. L'attribut slug est unique au sein du blog.

Objet Tag

{
    "id": 2000,
    "created_at": 1639655890,
    "is_private": false,
    "name": "Hello World",
    "description": "Saying hello to the world",
    "slug": "hello-world",
    "url": "https://subdomain.hyvorblogs.io/tag/hello-world",
    "posts_count": 20,
    "code_head": null,
    "code_foot": "<p>some code</p>",

    "language": language object,
    "variants": [ variant objects ],
}
Clé
Type
Description
id
integer
Un ID unique pour l'étiquette
created_at
integer
Le moment où l'étiquette a été créée
is_private
boolean
Si l'étiquette est privée. Voir Étiquettes privées
name
string
Nom (ou titre) de l'étiquette
description
string | null
Description de l'étiquette
slug
string
Slug d'URL de l'étiquette (le chemin par défaut complet sera /tag/{slug})
url
string
posts_count
integer
Nombre d'articles de l'étiquette
language
object
variants
array
Un tableau d'objets Variant

Objet Author

Un auteur est un utilisateur qui a écrit au moins un article

{
    "id": 3000,
    "created_at": 1639655890,
    "slug": "blogger",
    "url": "https://subdomain.hyvorblogs.io/author/blogger",
    "name": "Blogger",
    "picture_url": "https://example.com/image.png",
    "bio": "I am a blogger",
    "website_url": "https://example.com",
    "location": "France",
    "social": social media object,
    "posts_count": 32,

    "language": language object,
    "variants": [ variant objects ],
}
Clé
Type
Description
id
integer
Un ID unique pour l'auteur
created_at
integer
Le moment où l'auteur a été créé
slug
string
Slug d'URL de l'auteur (le chemin par défaut complet sera /author/{slug})
url
string
URL complète de l'utilisateur
name
string
Nom de l'auteur. Longueur maximale 50
picture_url
string | null
L'URL absolue de la photo de l'auteur. Généralement, une petite image carrée
bio
string | null
Biographie de l'auteur. Longueur maximale 256
website_url
string | null
L'URL absolue du site web de l'auteur
location
string | null
Emplacement de l'auteur. Longueur maximale 30
social
object
posts_count
integer
Nombre d'articles écrits par l'auteur
language
object
variants
array
Un tableau d'objets Variant

Objet Blog

{
    "subdomain": "alex",
    "name": "My Blog",
    "description": "This is my blog hosted on Hyvor Blogs",
    "logo_url": "https://blog.hyvorblogs.io/media/logo.png",
    "icon_url": "https://blog.hyvorblogs.io/media/icon.png",
    "cover_url": "https://blog.hyvorblogs.io/media/cover.png",
    "url": "https://blog.hyvorblogs.io",
    "social": social media object,
    "nav_header": [
        {
            "name": "Home",
            "url": "/"
        },
        {
            "name": "About",
            "url": "/about"
        }
    ],
    "nav_footer": [
        {
            "name": "Privacy",
            "url": "/privacy"
        }
    ],

    "languages": [ language objects ],

    "code_head": "",
    "code_foot": "",

    "posts_count": 200,

    // the following are blog settings
    // which are used for generating header code, color themes
    // and footer branding
    "seo_indexing": true,
    "color_modes": "light",
    "color_mode_default": "light",

    // for cache busting
    "cache_version_styles": 1,
}
Clé
Type
Description
subdomain
string
Sous-domaine du blog
name
string
Nom/titre du blog
description
string
Une courte description du blog (256 max)
logo_url
string | null
L'URL absolue de l'icône du blog. Généralement, une petite image carrée
cover_url
string | null
L'URL absolue de l'image mise en avant/de couverture
url
string | null
URL absolue du blog pour la langue actuelle
base_url
string
URL absolue du blog.
social
object
nav_header, nav_footer
array of objects
Liens de navigation pour l'en-tête et le pied de page du blog.
languages
array of objects
Toutes les langues disponibles du blog. Voir objet Language
code_head, code_foot
string
Code HTML personnalisé pour avant </head>, et </body> pour toutes les pages.
posts_count
integer
Total des articles publiés

Objet Language

{
    "id": 1000,
    "code": "en",
    "name": "English",
    "is_primary": true,
    "direction": "ltr"
}
Clé
Type
Description
id
integer
Un ID unique pour la langue
code
string
Code de la langue
name
string
Nom de la langue
is_primary
boolean
Si c'est la langue principale du blog
direction
string
Direction du texte. ltr ou rtl

Objet Variant

Un objet variant contient les données d’une variante linguistique d’un article, d’une étiquette ou d’un auteur.

{
    "language": {
        "id": 1001,
        "code": "fr",
        "name": "French",
        "is_primary": false,
        "direction": "ltr"
    },
    "url": "https://subdomain.hyvorblogs.io/fr/hello-world"
}
Clé
Type
Description
language
object
url
string
URL de la variante

Objet Pagination

Un objet pagination est inclus dans tous les points de terminaison à objets multiples (/posts, /authors, /tags).

{
    "total": 100,
    "pages": 10,
    "limit": 5,
    "page": 1,
    "page_prev": null,
    "page_next": 2,
}
Clé
Type
Description
total
integer
Le nombre total de résultats possibles avec les filtres actuels
pages
integer
Le nombre total de pages de pagination en fonction de la limite que vous avez définie. pages = round_to_upper(total/limit)
limit
integer
Limite actuelle
page
integer
Page actuelle
page_prev
integer ou string
Numéro de la page précédente (null s'il n'y a pas de pages précédentes)
page_next
integer ou string
Numéro de la page suivante (null s'il n'y a pas de pages suivantes)

Objet Social Media

{
    "facebook": null,
    "twitter": "https://twitter.com/HyvorBlogs",
    "linkedin": "https://www.linkedin.com/company/30240435",
    "youtube": null,
    "instagram": null,
    "github": "https://github.com/hyvor",
    "tiktok": null
}

Gestion des erreurs

En cas d’erreur, le code de statut HTTP sera un code de statut différent de 200.

Pour les erreurs 4xx, la réponse sera un objet JSON.

{
    "error": "ID is required",
    "error_code": "422"
}

Ces codes HTTP sont possibles :

  • 404 Not Found - Ressource non trouvée - 404 peut être retourné dans les points de terminaison à objet unique lorsque l'objet n'est pas trouvé - Assurez-vous que l'ID/slug (et la langue pour les articles) est correct
  • 422 Unprocessable Entity - Entrée invalide
    • Vérifiez les paramètres de requête
    • Vous pouvez trouver plus de détails dans la sortie JSON de l’erreur

Les erreurs 5xx signifient qu’un problème est survenu de notre côté. Consultez notre page de statut pour toute interruption de service. Si le problème persiste, contactez-nous.

Pages

Nous n’avons pas de points de terminaison distincts pour récupérer les Pages.

  • Pour obtenir une seule page, appelez le point de terminaison /post avec l’ID ou le slug de la page.
  • Pour obtenir plusieurs pages, appelez le point de terminaison /posts avec le paramètre ?pages=true.
  • /posts/search ne prend pas en charge la recherche de pages.