جلب — صفحات CMS
اقرأ بيانات «صفحات CMS». تعتمد النتيجة على معلمات هذه العملية.
GET/api/v1/pages/{page_id}
- المصادقة
Bearer- متاح بدءًا من
- STANDARD
- الصلاحيات المطلوبة
content.page:read
أمثلة الكود
مثال على الطلب
cURL
: "${SHOPENTLY_SHOP_URL:?}"
curl --disable --globoff --fail-with-body --silent --show-error \
--proto '=https' --connect-timeout 5 --max-time 30 \
--request GET \
--header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
--url "${SHOPENTLY_SHOP_URL%/}"/api/v1/pages/example
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 = [];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/pages/example');
curl_setopt_array($handle, [
CURLOPT_CUSTOMREQUEST => 'GET',
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);
},
]);
$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 = {}
headers["Authorization"] = 'Bearer' + " " + credential
body = None
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(
'GET', base_url + '/api/v1/pages/example', 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))
مثال على الاستجابة 200
{
"data": {
"body_html": "<p>Example</p>",
"created_at": "2026-01-01T12:00:00Z",
"id": "example",
"is_available": true,
"market_scope": "all",
"meta_description": "example",
"meta_keywords": [
"example"
],
"meta_title": "example",
"number": "example",
"published": false,
"slug": "example",
"title": "example",
"updated_at": "2026-01-01T12:00:00Z",
"version": 1
},
"meta": {
"locale": "en",
"market_code": "PL",
"market_id": "example",
"request_id": "example"
}
}
آلية العمل
- تشمل عمليات كتابة الصفحات العنوان وslug ومحتوى HTML وبيانات SEO الوصفية وحالة النشر ونطاق الأسواق المدعوم.
- اختر اللغة صراحة عند إدارة المحتوى المترجم.
- يغيّر PATCH الحقول المرسلة فقط.
- يُسمح بـ null فقط عندما يسمح المخطط والسياق بمسح القيمة.
- تظل قواعد النشر والتحقق من المحتوى والخطة سارية.
المعاملات
معلمات المسار
page_idسلسلة نصيةمطلوبمعرّف صفحة CMS.
القيود
pattern"^[a-z0-9][a-z0-9_-]{0,62}$"
معلمات الاستعلام
localeسلسلة نصية nullاختيارياللغة المحددة لهذا الطلب.
سلسلة نصية:minLength:2maxLength:20market_idسلسلة نصية nullاختياريمعرّف السوق الذي تعيده نقطة نهاية السياق.
القيود · سلسلة نصية 1
pattern"^[a-z0-9][a-z0-9_-]{0,62}$"
market_codeسلسلة نصية nullاختياريرمز السوق الذي تعيده نقطة نهاية السياق.
سلسلة نصية:minLength:1maxLength:16
لا تقبل هذه العملية محتوى JSON.
الاستجابات
الاستجابة 200
النموذج الكامل: ApiResponse_PageDetailData_
dataPageDetailDataمطلوبمحتوى الاستجابة الناجحة.
الحقول ·
dataالنموذج الكامل:
PageDetailDatabody_htmlسلسلة نصية nullمطلوبمحتوى الصفحة بتنسيق HTML.
created_atسلسلة نصيةمطلوبوقت الإنشاء.
format:"date-time"idسلسلة نصيةمطلوبمعرّف المورد؛ احتفظ به كما أعيد.
is_availableقيمة منطقيةمطلوبما إذا كان العنصر متاحًا في هذا السياق.
market_scopeسلسلة نصيةمطلوبما إذا كان المورد ينطبق على جميع الأسواق أو على الأسواق المحددة فقط.
القيود
enum["all", "selected"]
meta_descriptionسلسلة نصية nullمطلوبوصف محركات البحث باللغة المحددة.
meta_keywordsمصفوفة <سلسلة نصية> nullمطلوبالكلمات المفتاحية لمحركات البحث باللغة المحددة.
meta_titleسلسلة نصية nullمطلوبعنوان محركات البحث باللغة المحددة.
numberسلسلة نصيةمطلوبرقم طلب الشراء أو طلب الخدمة المعروض للمستخدم.
publishedقيمة منطقيةمطلوبما إذا كان المورد منشورًا.
slugسلسلة نصية nullمطلوبجزء مسار URL باللغة المحددة.
titleسلسلة نصية nullمطلوبالعنوان باللغة المحددة.
updated_atسلسلة نصيةمطلوبوقت آخر تحديث.
format:"date-time"versionعدد صحيحمطلوبإصدار المورد المستخدم للتحكم في التعديلات المتزامنة.
metaContextPageMetaContextMetaPageMetaRequestMetaمطلوبالبيانات الوصفية للاستجابة.
الحقول ·
metaالنموذج الكامل:
ContextPageMetalocaleسلسلة نصيةمطلوباللغة المحددة لهذا الطلب.
market_codeسلسلة نصيةمطلوبرمز السوق الذي تعيده نقطة نهاية السياق.
market_idسلسلة نصيةمطلوبمعرّف السوق الذي تعيده نقطة نهاية السياق.
paginationPaginationمطلوبالبيانات الوصفية للترقيم باستخدام المؤشر.
request_idسلسلة نصيةمطلوبمعرّف الطلب؛ في البيانات الوصفية للاستجابة يحدد طلب HTTP.
minLength:1maxLength:100
localeسلسلة نصيةمطلوباللغة المحددة لهذا الطلب.
market_codeسلسلة نصيةمطلوبرمز السوق الذي تعيده نقطة نهاية السياق.
market_idسلسلة نصيةمطلوبمعرّف السوق الذي تعيده نقطة نهاية السياق.
request_idسلسلة نصيةمطلوبمعرّف الطلب؛ في البيانات الوصفية للاستجابة يحدد طلب HTTP.
minLength:1maxLength:100
paginationPaginationمطلوبالبيانات الوصفية للترقيم باستخدام المؤشر.
request_idسلسلة نصيةمطلوبمعرّف الطلب؛ في البيانات الوصفية للاستجابة يحدد طلب HTTP.
minLength:1maxLength:100
request_idسلسلة نصيةمطلوبمعرّف الطلب؛ في البيانات الوصفية للاستجابة يحدد طلب HTTP.
minLength:1maxLength:100
حالة HTTP
200- استجابة ناجحة المخطط
400- طلب غير صالح
401- المصادقة مطلوبة
403- الإذن مرفوض
404- المورد غير موجود
409- تعارض الإصدارات
422- فشل التحقق من البيانات
429- تم تجاوز حد الطلبات
حالات HTTP الأخرى (7)
405- الطريقة غير مسموحة
413- الطلب كبير جدًا
415- تنسيق غير مدعوم
500- خطأ في الخادم
502- خطأ في بوابة API
503- الخدمة غير متاحة
504- انتهت مهلة الانتظار
دليل الأخطاء: ErrorResponse
الترويسات
401
WWW-Authenticateسلسلة نصيةاختيارينظام المصادقة الذي يطلبه الخادم.
405
Allowسلسلة نصيةاختياريطرق HTTP التي يدعمها هذا المورد.
429, 503
Retry-Afterعدد صحيحاختياريالحد الأدنى للانتظار قبل إعادة المحاولة، بالثواني.
minimum:0