جلب جميع المنشورات من موضوع باستخدام واجهة برمجة التطبيقات

:notebook_with_decorative_cover: هذا دليل يشرح كيفية جلب جميع المنشورات من موضوع معين باستخدام واجهة برمجة تطبيقات Discourse

النتائج التي تُرجعها واجهة برمجة تطبيقات Discourse للعديد من المسارات تكون مقسمة إلى صفحات.

على سبيل المثال، نقطة نهاية واجهة برمجة التطبيقات الخاصة بـ “الحصول على موضوع واحد” - مثل: https://examplesite/t/{id}.json ستُرجع افتراضيًا 20 منشورًا فقط، حتى لو كان الموضوع يحتوي على أكثر من 20 منشورًا.

بسبب هذا السلوك، هناك طريقتان يمكنك من خلالهما استخدام واجهة برمجة تطبيقات Discourse لجلب جميع منشورات موضوع معين باستخدام نقطة النهاية .../t/{id}.json.

إضافة معامل استعلام

أسهل طريقة لجلب جميع منشورات موضوع معين هي إضافة معامل استعلام print=true إلى عنوان URL الذي ترسل إليه الطلب.

مثال: https://examplesite/t/{id}.json?print=true

عند إضافة معامل الاستعلام print=true، يقوم Discourse بتعيين chunk_size لعدد المنشورات المُرجعة إلى 1000. وهذا يعني أن هذه طريقة جيدة للاستخدام طالما أنك متأكد من أن مواضيعك لا تحتوي على أكثر من 1000 منشور.

طلبات واجهة برمجة تطبيقات متعددة

الطريقة الأخرى لجلب جميع المنشورات هي إجراء عدة طلبات لواجهة برمجة التطبيقات للحصول على جميع منشورات الموضوع:

  1. أولاً، قم بإجراء طلب GET أولي إلى نقطة النهاية .../t/{id}.json. سيحتوي هذا الطلب على كائن posts_stream يحتوي على مصفوفة posts ومصفوفة stream. ستُعطيك مصفوفة posts أول 20 منشورًا.

  2. الآن تحتاج إلى التكرار عبر مصفوفة stream التي تمنحك جميع معرفات المنشورات في الموضوع. احذف أول 20 معرف منشور من المصفوفة stream (وإلا فإنك تقوم بإعادة تحميلها دون داعٍ).

  3. بعد ذلك، يمكنك إجراء طلبات إضافية إلى نقطة النهاية الحصول على منشورات محددة من موضوع .../t/{id}/posts.json، وإضافة post_ids[]، وإرسال جميع المعرفات من مصفوفة stream على دفعات من 20. مثال:
    .../t/{id}/posts.json?post_ids[]=46&post_ids[]=47&post_ids[]=48&post_ids[]=49&post_ids[]=50&post_ids[]=51&post_ids[]=52&post_ids[]=53&post_ids[]=54&post_ids[]=55&post_ids[]=56&post_ids[]=57&post_ids[]=58&post_ids[]=59&post_ids[]=60&post_ids[]=61&post_ids[]=62&post_ids[]=63&post_ids[]=64&post_ids[]=65

حدود المعدل

إذا واجهت رسالة خطأ Error: you have performed this action many times, please try again later عند إجراء عدة مكالمات لواجهة برمجة التطبيقات، فهذا يشير إلى أنك وصلت إلى حدود معدل مفتاح واجهة برمجة التطبيقات.

يحتوي Discourse على حد لعدد طلبات print=true التي يمكن إجراؤها في الساعة، ويتم التحكم فيه عبر إعداد الموقع max prints per hour per user. يكون هذا الإعداد مضبوطًا افتراضيًا للسماح للمستخدمين بطباعة 5 مواضيع فقط في الساعة. إذا قمت بتعيينه إلى 0، سيتم تعطيل الطباعة بالكامل (ستُرجع الطلبات التي تحتوي على print=true خطأ 403).

لاحظ أن حد المعدل لن يُطبق إذا كان المستخدم الذي يقوم بالطلب هو مسؤول. وهذا يعني أنه يمكنك استخدام مفتاح واجهة برمجة تطبيقات مع اسم مستخدم مسؤول (مثل system) لمعامل Api-Username في الطلب لتجاوز حد معدل الطباعة.

إذا كنت تواجه أخطاء تتعلق بحدود المعدل مع طلبات واجهة برمجة التطبيقات التي لا تحتوي على print=true، فإننا نوصي بإضافة مهلة زمنية (timeout) إلى سكريبت واجهة برمجة التطبيقات الخاص بك حتى لا تتجاوز حدود المعدل. وبديلًا عن ذلك، يمكنك الاستماع إلى أكواد الأخطاء 429 (طلبات كثيرة جدًا) والتوقف المؤقت عن إرسال الطلبات عند استلام هذه الاستجابة.

للمرجعية، تنطبق حدود المعدل الافتراضية المدرجة أدناه على خطط الاستضافة القياسية والتجارية لدينا:

:grey_exclamation: للاستضافة الذاتية فقط - راجع: Available settings for global rate limits and throttling للحصول على تفاصيل حول ضبط حدود معدل واجهة برمجة تطبيقات Discourse.

11 إعجابًا

هل يتم دعم معلمة الاستعلام ?page؟ إنها تعمل، ولكن بطريقة مفاجئة - ?page=1 تُرجع المنشور الأول فقط في الموضوع، لذلك للتنقل باستخدام المعلمة تحتاج إلى البدء بـ https://example.com/t/slug/topicId.json، ثم الانتقال إلى https://example.com/t/slug/topicId.json?page=2، ثم الاستمرار حتى تحصل في النهاية على استجابة 404.

مرحباً سيمون،

استخدام المعلمة ?page=1 مع نقطة نهاية الحصول على موضوع واحد سيعيد أول 20 مشاركة من موضوع، وكل رقم صفحة لاحق سيعيد ما يصل إلى 20 مشاركة.

عندما لا تكون هناك مشاركات متاحة (مثال: الصفحة مرتفعة جدًا وغير صالحة)، ستحصل على استجابة 404.

إذا لم تحدد رقم صفحة، فسيقوم الرمز بتعيين رقم الصفحة إلى 1، لذا فإن ?page=1 هو نفس عدم إلحاق صفحة صريحة بطلب الموضوع.

إذا كنت ترغب في استخدام هذه الطريقة لجلب جميع المشاركات من موضوع، فيجب أن تكون قادرًا على القيام بذلك، على الرغم من أنه لم يتم ذكره في مستندات واجهة برمجة تطبيقات Discourse.

3 إعجابات

شكرا! أعمل على روبوت Matrix لجلب المشاركات!

أعتقد أن هذا خطأ. تعيينه إلى 0 سيعطل الطباعة على الإطلاق. الوصف الأخير لهذا الإعداد هو الحد الأقصى لعدد مرات عرض صفحة /print (تعيينه إلى 0 لتعطيل الطباعة).