Pređi na sadržaj
ShopentlyLearn

Izmeni članak

Izmena nacrta članaka i prevoda

PATCH/api/v1/addons/shopently.blog/posts/{post_id}

Autentifikacija
Bearer
Dostupno od
BASIC
Potreban instalirani modul
shopently.blog · Verzija ugovora modula 1
Potrebna ovlašćenja
addon.shopently.blog:post_update

Primeri koda

Primer zahteva

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request PATCH \
  --header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
  --header 'Idempotency-Key: learn-6486f38921214552949f30311a1f543f' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "excerpt": "Praktyczny poradnik: porównanie właściwości i wariantów.",
  "expected_version": 1,
  "locale": "pl"
}' \
  --url "${SHOPENTLY_SHOP_URL%/}"/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851

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-6486f38921214552949f30311a1f543f', 'Content-Type: application/json'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    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, '{
  "excerpt": "Praktyczny poradnik: porównanie właściwości i wariantów.",
  "expected_version": 1,
  "locale": "pl"
}');
$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-6486f38921214552949f30311a1f543f'}
headers["Authorization"] = 'Bearer' + " " + credential
body = '{\n  "excerpt": "Praktyczny poradnik: porównanie właściwości i wariantów.",\n  "expected_version": 1,\n  "locale": "pl"\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(
        'PATCH', base_url + '/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851', 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))

Primer odgovora 200

JSON
{
  "data": {
    "html_normalized": false,
    "id": "2103ba96-2713-420b-b197-8a008730c851",
    "public_number": null,
    "revision_id": "5745799d-723b-4341-9f6e-1a63e50f1d40",
    "status": "draft",
    "version": 2
  },
  "meta": {
    "request_id": "bd4bb9ba-0f29-41c0-858d-3581bb03928f"
  }
}

Pregled

Vodite blog prodavnice sa HTML člancima, fotografijama, autorima i metapodacima za pretraživače. Čuvajte nacrte, pripremajte prevode i objavljujte odmah ili u izabrano vreme u određenoj vremenskoj zoni. Upravljajte komentarima i moderiranjem u panelu; spoljni generator može da koristi API sa dodeljenim dozvolama.

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

Parametri

Parametri putanje

post_idNiz znakovaObavezno

Članak

format: "uuid"
Primer: "2103ba96-2713-420b-b197-8a008730c851"

Zaglavlja zahteva

Idempotency-KeyNiz znakovaObavezno

Jedinstveni identifikator jedne logičke operacije upisa.

minLength: 1maxLength: 128
Ograničenja
pattern
"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
Primer: "learn-6486f38921214552949f30311a1f543f"

Telo zahteva

application/json · Obavezno

ObjekatDodatna polja: Ne
author_idNiz znakova nullOpciono

Autor

Niz znakova:format: "uuid"
comments_modeNiz znakovaOpciono

Komentari

Ograničenja
enum
["inherit", "open", "closed"]
content_htmlNiz znakovaOpciono

Sadržaj

maxLength: 50000
cover_altNiz znakovaOpciono

Alternativni tekst

maxLength: 250
cover_captionNiz znakovaOpciono

Opis fotografije

maxLength: 500
cover_media_idNiz znakova nullOpciono

Naslovna fotografija

Niz znakova:format: "uuid"
excerptNiz znakovaOpciono

Uvod

maxLength: 1000
expected_versionCeli brojObavezno

Verzija pročitana pre upisa; nepodudaranje odbija ažuriranje.

minimum: 1maximum: 9223372036854775807
localeNiz znakovaObavezno

Jezik odabran za ovaj zahtev.

minLength: 2maxLength: 35
Ograničenja
pattern
"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
meta_descriptionNiz znakovaOpciono

Opis za pretraživače na odabranom jeziku.

maxLength: 160
meta_keywordsNiz vrednosti <Niz znakova> Opciono

Ključne reči za pretraživače na odabranom jeziku.

maxItems: 20
Niz vrednosti:minLength: 1maxLength: 50
meta_titleNiz znakovaOpciono

Naslov za pretraživače na odabranom jeziku.

maxLength: 70
slugNiz znakovaOpciono

Deo URL putanje na odabranom jeziku.

maxLength: 160
titleNiz znakovaOpciono

Naslov na odabranom jeziku.

maxLength: 200

Odgovori

Odgovor 200

dataObjekatDodatna polja: NeObavezno

Podaci uspešnog odgovora.

Polja · data
html_normalizedLogička vrednostObavezno

HTML · category-v1

idNiz znakovaObavezno

Identifikator resursa; sačuvajte ga u vraćenom obliku.

format: "uuid"
public_numberCeli broj nullOpciono

Broj

Celi broj:minimum: 1
revision_idNiz znakovaObavezno

Verzija

format: "uuid"
statusNiz znakovaObavezno

Status prihvaćen za ovu određenu operaciju.

Ograničenja
enum
["draft", "scheduled", "published", "archived"]
versionCeli brojObavezno

Verzija resursa za kontrolu istovremenih upisa.

minimum: 1maximum: 9223372036854775807
metaObjekatDodatna polja: NeObavezno

Metapodaci odgovora.

Polja · meta
request_idNiz znakovaObavezno

Identifikator zahteva; u metapodacima odgovora označava HTTP zahtev.

minLength: 1maxLength: 100
Primer odgovora

HTTP status

200
Uspešan odgovor Šema
400
Nevažeći zahtev
401
Potrebna je autentifikacija
403
Pristup odbijen
404
Resurs nije pronađen
409
Sukob verzija
422
Provera nije uspela
429
Prekoračeno ograničenje zahteva
Ostali HTTP statusi (7)
405
Metoda nije dozvoljena
413
Zahtev je prevelik
415
Nepodržan format
500
Greška servera
502
Greška API mrežnog prolaza
503
Usluga nije dostupna
504
Istek vremena

Katalog grešaka: ErrorResponse

Zaglavlja

401

WWW-AuthenticateNiz znakovaOpciono

Šema autentifikacije koju zahteva server.

405

AllowNiz znakovaOpciono

HTTP metode koje ovaj resurs podržava.

429, 503

Retry-AfterCeli brojOpciono

Najkraće čekanje pre ponavljanja, u sekundama.

minimum: 0