أدلة التكامل
ابن دليلًا عامًا لحملات حقيقية
اقرأ نقطة الاكتشاف من خادمك واعرض استجابة محدودة وروابط لمسار المشاركة الفعلي.
قبل البدء
- خادم Node 20+ مع fetch أو Python 3 مع urllib أو PHP مع cURL وJSON.
- عنوان Server عبر HTTPS وبلد مدعوم فعلًا؛ لا تتطلب هذه القراءة مفاتيح حساب سرية.
- واجهة تعرض النص بأمان وتعالج النتائج الفارغة أو غير المتاحة.
اختر نوعًا صريحًا
تدعم GET /api/public/homepage/discovery المعلمات type=all|ticketing|voting|donation وcountry وq وlocation وstatus وdate وsort وpage وlimit. يقرأ المثال تذاكر غانا ولا يفعل أي دفع.
ثبت وجهة HTTPS على الخادم. افحص حالة HTTP وsuccess مع مهلة محددة، ولا تقبل عنوانًا عشوائيًا من الزائر.
export async function readPublicCampaigns() {
const url = new URL('/api/public/homepage/discovery', 'https://api.sparkglim.net');
url.search = new URLSearchParams({ type: 'ticketing', country: 'GH', sort: 'latest', page: '1', limit: '12' }).toString();
const response = await fetch(url, { headers: { accept: 'application/json' }, signal: AbortSignal.timeout(12000) });
const payload = await response.json();
if (!response.ok || payload.success !== true || !payload.data) throw new Error(payload.error || 'Discovery unavailable');
return payload.data;
}import json
import urllib.parse
import urllib.request
def read_public_campaigns():
query = urllib.parse.urlencode({"type": "ticketing", "country": "GH", "sort": "latest", "page": "1", "limit": "12"})
request = urllib.request.Request("https://api.sparkglim.net/api/public/homepage/discovery?" + query, headers={"Accept": "application/json"})
with urllib.request.urlopen(request, timeout=12) as response:
payload = json.load(response)
if payload.get("success") is not True or not isinstance(payload.get("data"), dict):
raise RuntimeError("Discovery unavailable")
return payload["data"]<?php
function read_public_campaigns(): array {
$query = http_build_query(['type'=>'ticketing','country'=>'GH','sort'=>'latest','page'=>1,'limit'=>12], '', '&', PHP_QUERY_RFC3986);
$handle = curl_init('https://api.sparkglim.net/api/public/homepage/discovery?' . $query);
curl_setopt_array($handle, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>12, CURLOPT_HTTPHEADER=>['Accept: application/json']]);
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false || $status < 200 || $status >= 300) throw new RuntimeException($error ?: 'Discovery unavailable');
$payload = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
if (($payload['success'] ?? false) !== true || !is_array($payload['data'] ?? null)) throw new RuntimeException('Discovery unavailable');
return $payload['data'];
}أنشئ وسيط قراءة محدودًا
احفظ دالة TypeScript في read-public-campaigns.ts. المثال التالي معالج Next.js يوضع داخل مجلد API المقصود في تطبيقك.
خزن البيانات العامة الناجحة مؤقتًا لفترة قصيرة واستخدم no-store عند الخطأ. الوسيط ليس أداة توجيه مفتوحة لعناوين يقدمها المستخدم.
import { readPublicCampaigns } from './read-public-campaigns';
export async function GET() {
try {
const data = await readPublicCampaigns();
return Response.json({ success: true, data }, { headers: { 'Cache-Control': 'public, max-age=60' } });
} catch {
return Response.json({ success: false, error: 'Discovery unavailable' }, { status: 503, headers: { 'Cache-Control': 'no-store' } });
}
}اعرض السجلات الحقيقية
اقرأ data.entries وdata.available وdata.pagination. القائمة الفارغة وعدم التوفر والخطأ حالات مختلفة، ولا تستبدلها بفعاليات مختلقة.
اعرض العناوين كنص واستخدم نوع الحملة وslug الحقيقيين لروابط التذاكر والتصويت والتبرع. احفظ البلد واللغة ولا تضع الدفع في iframe.
تحقق من تكاملك
- تحقق من البيانات والنتائج الفارغة وخطأ 503 دون إنشاء معاملات.
- احفظ النوع والترقيم والعملة والتواريخ وحدود الظهور الفعلية.