L’API de données retourne les données publiques du blog.
GET.https://blogs.hyvor.com/api/data/v0/{subdomain}https://example.hyvor.com, le chemin de base est https://blogs.hyvor.com/api/data/v0/example {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.
Objet unique
/post - un article/page/tag/author/blog- paramètres du blogObjets multiples
/posts/posts/search - rechercher des articles/tags/authorsPour 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
}Pour /post, /tag, et /author
idintegerSoit 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.
/posts, /posts/search, /tags, et /authors
Le point de terminaison /posts/search a un paramètre search requis en plus des paramètres ci-dessus.
searchLe 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).
visibilitypublic - uniquement les étiquettes publiques, private - uniquement les étiquettes privées, any - toutes les étiquettespubliclanguageSi 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.
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. limitLe 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.
pageLe 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=2filterExemple : (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 :
keyoperatorvalue= - égal à!= - différent de> - supérieur à< - inférieur à>= - supérieur ou égal à<= - inférieur ou égal ànulltrue ou false'hello' ou hello [a-zA-Z_][a-zA-Z0-9_-]+ et ne peuvent pas être true, false, ou null.250, -250,2.5Vous pouvez utiliser des opérateurs logiques pour combiner plusieurs conditions.
| - OU& - ETVeuillez consulter la documentation FilterQ Expressions si vous avez besoin de plus de détails.
/postsidintegeris_featured=, !=booleanslug=, !=stringfeatured_image_url=, !=nullcanonical_url=, !=stringwordsintegertag.idintegertag.slug=, !=stringauthor.idintegerauthor.slug=, !=string/tags et /authorsidintegerslug=, !=stringpost_countintegerVoici 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 UNIXPar 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.
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%3DalexPour obtenir les articles à la une :
// filter
is_featured=true
// URL-encoded
/posts?filter=is_featured%3DtruePour 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%3DvideoPour obtenir les étiquettes ayant au moins 5 articles :
// filter
posts_count>=5
// URL-encoded
/tags?filter=posts_count%3E%3D5Pour 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%27Pour 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%27sortVoici 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.
/posts Défaut published_at DESCpublished_atcreated_atupdated_atidis_featuredtitlewords/tags et /authors Défaut posts_count DESCpost_countcreated_atLa 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écroissantpublished_at ASC - trié par published_at par ordre croissantis_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.keysLe 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
}
]
}Tous les horodatages sont au format Horodatage Unix (entier).
{
"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 ]
}idintegercreated_atintegerupdated_atintegerpublished_atintegeris_featuredbooleanslugstringurlstringcontentstringtitlestringdescriptionstring | nullfeatured_image_urlstring | nullcanonical_urlstring | nullwordsintegerDans les articles, l'attribut id est unique au niveau mondial dans Hyvor Blogs. L'attribut slug est unique au sein du blog.
{
"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 ],
}idintegercreated_atintegernamestringdescriptionstring | nullslugstring/tag/{slug})urlstringposts_countintegerUn 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 ],
}idintegercreated_atintegerslugstring/author/{slug})urlstringnamestringpicture_urlstring | nullbiostring | nullwebsite_urlstring | nulllocationstring | nullposts_countinteger{
"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,
}subdomainstringnamestringdescriptionstringlogo_urlstring | nullcover_urlstring | nullurlstring | nullbase_urlstringnav_header, nav_footerarray of objectscode_head, code_footstring</head>, et </body> pour toutes les pages.posts_countinteger{
"id": 1000,
"code": "en",
"name": "English",
"is_primary": true,
"direction": "ltr"
}idintegercodestringnamestringis_primarybooleandirectionstringltr ou rtlUn 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"
}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,
}totalintegerpagesintegerpages = round_to_upper(total/limit)limitintegerpageintegerpage_previnteger ou stringnull s'il n'y a pas de pages précédentes)page_nextinteger ou stringnull s'il n'y a pas de pages suivantes){
"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
}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 :
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.
Nous n’avons pas de points de terminaison distincts pour récupérer les Pages.
/post avec l’ID ou le slug de la page./posts avec le paramètre ?pages=true./posts/search ne prend pas en charge la recherche de pages.