Aller au contenu
ShopentlyLearn

Nouvel article

Créer des brouillons d’articles

POST/api/v1/addons/shopently.blog/posts

Authentification
Bearer
Disponible à partir de
BASIC
Module installé requis
shopently.blog · Version du contrat du module 1
Autorisations requises
addon.shopently.blog:post_create

Exemples de code

Exemple de requête

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request POST \
  --header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
  --header 'Idempotency-Key: learn-8ee78b431a9e4a4198d15a5dd386bb14' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "author_id": "341494e0-caab-4f47-a8ff-f6795c42a775",
  "comments_mode": "open",
  "content_html": "<h2>Porównaj właściwości</h2><p>Sprawdź opis produktu i wybierz wariant odpowiedni do swoich potrzeb.</p>",
  "cover_alt": "Niebieska ilustracja poradnika",
  "cover_caption": "Ilustracja redakcyjna",
  "cover_media_id": "e8663afe-3c38-461c-a142-a980085630af",
  "excerpt": "Praktyczny poradnik zakupowy.",
  "locale": "pl",
  "meta_description": "Praktyczne wskazówki dotyczące wyboru produktu.",
  "meta_keywords": [
    "poradnik",
    "wybór"
  ],
  "meta_title": "Jak wybrać produkt",
  "slug": "jak-wybrac-produkt",
  "title": "Jak wybrać produkt"
}' \
  --url "${SHOPENTLY_SHOP_URL%/}"/api/v1/addons/shopently.blog/posts

PHP

<?php
declare(strict_types=1);

$baseUrl = rtrim(getenv('SHOPENTLY_SHOP_URL') ?: '', '/');
$origin = parse_url($baseUrl);
if (!$origin || ($origin['scheme'] ?? '') !== 'https' || empty($origin['host']) ||
    isset($origin['user'], $origin['pass']) || isset($origin['user']) || isset($origin['path']) ||
    isset($origin['query']) || isset($origin['fragment'])) {
    throw new RuntimeException('SHOPENTLY_SHOP_URL must be an HTTPS origin');
}
$credential = getenv('SHOPENTLY_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
    throw new RuntimeException('Invalid credential');
}
$headers = ['Idempotency-Key: learn-8ee78b431a9e4a4198d15a5dd386bb14', 'Content-Type: application/json'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/addons/shopently.blog/posts');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HEADERFUNCTION => static function ($handle, string $line) use (&$responseHeaders): int {
        if (str_contains($line, ':')) {
            [$name, $value] = explode(':', $line, 2);
            $responseHeaders[strtolower(trim($name))] = trim($value);
        }
        return strlen($line);
    },
]);
curl_setopt($handle, CURLOPT_POSTFIELDS, '{
  "author_id": "341494e0-caab-4f47-a8ff-f6795c42a775",
  "comments_mode": "open",
  "content_html": "<h2>Porównaj właściwości</h2><p>Sprawdź opis produktu i wybierz wariant odpowiedni do swoich potrzeb.</p>",
  "cover_alt": "Niebieska ilustracja poradnika",
  "cover_caption": "Ilustracja redakcyjna",
  "cover_media_id": "e8663afe-3c38-461c-a142-a980085630af",
  "excerpt": "Praktyczny poradnik zakupowy.",
  "locale": "pl",
  "meta_description": "Praktyczne wskazówki dotyczące wyboru produktu.",
  "meta_keywords": [
    "poradnik",
    "wybór"
  ],
  "meta_title": "Jak wybrać produkt",
  "slug": "jak-wybrac-produkt",
  "title": "Jak wybrać produkt"
}');
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false) {
    throw new RuntimeException('Transport error: ' . $error);
}
if ($status < 200 || $status >= 300) {
    throw new RuntimeException('HTTP ' . $status . '; request_id=' .
        ($responseHeaders['x-request-id'] ?? '') . '; retry_after=' . ($responseHeaders['retry-after'] ?? ''));
}
$result = $raw === '' ? null : json_decode($raw, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), PHP_EOL;

Python

from contextlib import ExitStack
import json
import os
from urllib.parse import urlsplit

import requests  # python -m pip install requests

base_url = os.environ["SHOPENTLY_SHOP_URL"].rstrip("/")
origin = urlsplit(base_url)
if origin.scheme != "https" or not origin.hostname or origin.username or origin.password or origin.path or origin.query or origin.fragment:
    raise ValueError("SHOPENTLY_SHOP_URL must be an HTTPS origin")
credential = os.environ['SHOPENTLY_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
    raise ValueError("Invalid credential")
headers = {'Idempotency-Key': 'learn-8ee78b431a9e4a4198d15a5dd386bb14'}
headers["Authorization"] = 'Bearer' + " " + credential
body = '{\n  "author_id": "341494e0-caab-4f47-a8ff-f6795c42a775",\n  "comments_mode": "open",\n  "content_html": "<h2>Porównaj właściwości</h2><p>Sprawdź opis produktu i wybierz wariant odpowiedni do swoich potrzeb.</p>",\n  "cover_alt": "Niebieska ilustracja poradnika",\n  "cover_caption": "Ilustracja redakcyjna",\n  "cover_media_id": "e8663afe-3c38-461c-a142-a980085630af",\n  "excerpt": "Praktyczny poradnik zakupowy.",\n  "locale": "pl",\n  "meta_description": "Praktyczne wskazówki dotyczące wyboru produktu.",\n  "meta_keywords": [\n    "poradnik",\n    "wybór"\n  ],\n  "meta_title": "Jak wybrać produkt",\n  "slug": "jak-wybrac-produkt",\n  "title": "Jak wybrać produkt"\n}'
if body is not None:
    headers["Content-Type"] = "application/json"

with ExitStack() as stack:
    session = stack.enter_context(requests.Session())
    files = None
    if False:
        image = stack.enter_context(open(os.environ["SHOPENTLY_IMAGE_FILE"], "rb"))
        if os.fstat(image.fileno()).st_size > 5242880:
            raise ValueError("Image exceeds 5 MiB")
        files = {"file": ("article.png", image, "image/png")}
    response = session.request(
        'POST', base_url + '/api/v1/addons/shopently.blog/posts', headers=headers,
        data=body.encode("utf-8") if body is not None else None, files=files,
        timeout=(5, 30), allow_redirects=False,
    )
    if not 200 <= response.status_code < 300:
        raise RuntimeError(f"HTTP {response.status_code}; request_id={response.headers.get('X-Request-ID', '')}; retry_after={response.headers.get('Retry-After', '')}")
    if False:
        if response.headers.get("Content-Type") != "image/webp" or len(response.content) > 5242880:
            raise ValueError("Unexpected image response")
        with open(os.environ["SHOPENTLY_OUTPUT_FILE"], "xb") as output:
            output.write(response.content)
    else:
        result = response.json() if response.content else None
        print(json.dumps(result, ensure_ascii=False, indent=2))

Exemple de réponse 201

JSON
{
  "data": {
    "html_normalized": false,
    "id": "2103ba96-2713-420b-b197-8a008730c851",
    "public_number": 1,
    "revision_id": "8c4af6da-63f4-42aa-8b37-57c703fa0af7",
    "status": "draft",
    "version": 1
  },
  "meta": {
    "request_id": "f6a16d96-69fc-401d-9d04-cdc96f86a4c7"
  }
}

Vue d’ensemble

Animez le blog de votre boutique avec des articles HTML, des photos, des auteurs et des métadonnées pour les moteurs de recherche. Enregistrez des brouillons, préparez des traductions et publiez immédiatement ou à une heure choisie dans un fuseau précis. Gérez les commentaires et leur modération dans le panneau ; un générateur externe peut utiliser l’API avec les autorisations accordées.

BASIC · api.enabled · addons.use(shopently.blog) · addon.shopently.blog:post_create

Paramètres

En-têtes de requête

Idempotency-KeyChaîneObligatoire

Identifiant unique d'une opération logique d'écriture.

minLength: 1maxLength: 128
Contraintes
pattern
"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
Exemple: "learn-8ee78b431a9e4a4198d15a5dd386bb14"

Corps de la requête

application/json · Obligatoire

ObjetChamps supplémentaires: Non
author_idChaîne nullObligatoire

Auteur

Chaîne:format: "uuid"
comments_modeChaîneObligatoire

Commentaires

Contraintes
enum
["inherit", "open", "closed"]
content_htmlChaîneObligatoire

Contenu

maxLength: 50000
cover_altChaîneObligatoire

Texte alternatif

maxLength: 250
cover_captionChaîneObligatoire

Légende de la photo

maxLength: 500
cover_media_idChaîne nullObligatoire

Photo de couverture

Chaîne:format: "uuid"
excerptChaîneObligatoire

Contenu

maxLength: 1000
expected_versionEntierFacultatif

Version lue avant l'écriture ; une différence entraîne le rejet de la modification.

const: 1
Valeur par défaut: 1
localeChaîneObligatoire

Langue sélectionnée pour cette requête.

minLength: 2maxLength: 35
Contraintes
pattern
"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
meta_descriptionChaîneObligatoire

Description pour les moteurs de recherche dans la langue sélectionnée.

maxLength: 160
meta_keywordsTableau <Chaîne> Obligatoire

Mots-clés pour les moteurs de recherche dans la langue sélectionnée.

maxItems: 20
Tableau:minLength: 1maxLength: 50
meta_titleChaîneObligatoire

Titre pour les moteurs de recherche dans la langue sélectionnée.

maxLength: 70
slugChaîneObligatoire

Segment du chemin URL dans la langue sélectionnée.

maxLength: 160
titleChaîneObligatoire

Titre dans la langue sélectionnée.

maxLength: 200

Réponses

Réponse 201

dataObjetChamps supplémentaires: NonObligatoire

Données d'une réponse réussie.

Champs · data
html_normalizedBooléenObligatoire

HTML · category-v1

idChaîneObligatoire

Identifiant de ressource ; conserver la valeur renvoyée.

format: "uuid"
public_numberEntier nullFacultatif

Numéro

Entier:minimum: 1
revision_idChaîneObligatoire

Révision

format: "uuid"
statusChaîneObligatoire

Statut accepté par cette opération précise.

Contraintes
enum
["draft", "scheduled", "published", "archived"]
versionEntierObligatoire

Version de ressource utilisée pour le contrôle de concurrence.

minimum: 1maximum: 9223372036854775807
metaObjetChamps supplémentaires: NonObligatoire

Métadonnées de la réponse.

Champs · meta
request_idChaîneObligatoire

Identifiant de demande ; dans les métadonnées, identifiant de la requête HTTP.

minLength: 1maxLength: 100
Exemple de réponse

Statut HTTP

201
Ressource créée Schéma
400
Requête invalide
401
Authentification requise
403
Accès refusé
404
Ressource introuvable
409
Conflit de version
422
Échec de validation
429
Limite de requêtes dépassée
Autres statuts HTTP (7)
405
Méthode non autorisée
413
Requête trop volumineuse
415
Format non pris en charge
500
Erreur du serveur
502
Erreur de passerelle API
503
Service indisponible
504
Délai de passerelle dépassé

Catalogue des erreurs: ErrorResponse

En-têtes

401

WWW-AuthenticateChaîneFacultatif

Schéma d'authentification exigé par le serveur.

405

AllowChaîneFacultatif

Méthodes HTTP prises en charge par cette ressource.

429, 503

Retry-AfterEntierFacultatif

Délai minimal avant une nouvelle tentative, en secondes.

minimum: 0