كيفية استخدام مفتاح API في استدعاء AJAX؟

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

الكود لا يعمل، وأعتقد أن السبب قد يكون عدم فهمي لكيفية عمل مفاتيح واجهة برمجة التطبيقات.

إذا أردت من Discourse إجراء استدعاء لواجهة برمجة التطبيقات لاسترجاع معلومات حول مجموعة ما، في كل مرة يزور فيها أي مستخدم صفحة معينة، فما هو إعداد مفتاح واجهة برمجة التطبيقات الصحيح؟

إليك ما لدي حتى الآن:

في لوحة التخصيص الخاصة بي، انتقلت إلى واجهة برمجة التطبيقات → مفتاح واجهة برمجة تطبيقات جديد. هناك، أحتاج إلى اختيار “مستوى المستخدم”. آسف على السؤال الأساسي، ولكن ماذا يعني “مستوى المستخدم” هنا؟ (يجب أن يعمل استدعاء واجهة برمجة التطبيقات في كل مرة يزور فيها أي مستخدم الصفحة المحددة).

لقد اخترت “جميع المستخدمين”. ثم قمت بتوليد الرمز.

بعد ذلك، في لوحة تخصيص CSS/HTML الخاصة بي تحت وسم ، أدخلت ما يلي بين وسوم <script> ذات الصلة:

var groupName = [اسم المجموعة ذي الصلة]
var token = [الرمز الذي تولدته]
$.ajax({
     url: 'https://myforum.com/groups/groupName.json',
      contentType: "application/json",
      headers: {
          "Api-Key": token,
          "Api-Username": "system"
        },
        dataType: 'json',
        success: function(result){
             console.log('result = ' + result);
         }
})

الكود يعمل، لكنه يعيد خطأ يشير إلى عدم الترخيص (رغم أنني مدير، وأحد أعضاء المجموعة التي أستخدمها للتجربة).

ما الذي أحتاج إلى تغييره؟

ألا يؤدي هذا إلى تعريض مفتاح API الخاص بجميع المستخدمين للجميع الذين يمكنهم عرض موقعك؟ أعتقد أنك ستحتاج إلى إيجاد نهج آخر للحصول على بيانات المجموعة من مكون السمة.

إذا لم تكن معلومات المجموعة التي تحتاجها متاحة في تحميل JSON للمستخدم، فيجب عليك معرفة كيفية إضافتها إلى المصمم. قد تساعدك في ذلك عمليات البحث عن “إضافة إلى المصمم” أو ربما addToSerializer أو add_to_serializer في مكونات السمات والإضافات الموجودة.

لكن ألا ينبغي أن يعمل الكود في أي حال؟ توفر الواجهة البرمجية القدرة على استرجاع معلومات حول مجموعة. لا زلت مرتبكًا بشأن كيفية عمل هذا على ما أعتقد.

ما هي الطريقة الطبيعية لاستخدام الواجهة البرمجية للحصول على معلومات حول مجموعة معينة؟

المعلومة الأساسية التي أبحث عنها هي ما إذا كان المستخدم مالكًا للمجموعة أم لا. تُرجع واجهة برمجة التطبيقات (API) الخاصة بـ JSON هذه المعلومات. لذا، عندما ينتقل المستخدم إلى صفحة معينة، أريد إرسال طلب إلى واجهة برمجة التطبيقات للحصول على معلومات حول المجموعة، والتي تتضمن في الاستجابة الأساسية ما إذا كان المستخدم المسجل في العميل مالكًا أم لا.

يبدو هذا وكأنه تطبيق مباشر لواجهة برمجة التطبيقات. ومع ذلك، يبدو أن هذه العملية تتطلب مفتاح واجهة برمجة التطبيقات، لكن الطريقة التي استخدمتها حتى الآن لا تعمل.

لا أعتقد أن إنشاء مكون منفصل للإضافة (plug-in) أو المظهر (theme) مطلوب هنا، حيث أن هذه العملية هي إحدى العمليات الأساسية التي توفرها واجهة برمجة التطبيقات الخاصة بـ JSON.

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

تعديل: إذا كان هذا غير مناسب لأي سبب من الأسباب لطلب واجهة برمجة التطبيقات، فعندئذٍ سيكون من الضروري تسلسله (serialization). هل لدى أي شخص كود يعمل لذلك؟ أنا أدرك وجود طريقة add_to_serializer، لكنني لم أستطع جعل بناء الجملة يعمل بشكل صحيح، وقد كافحت للعثور على أمثلة عاملة لهذه الطريقة.

عزيزي @JQ331

نعم، قمت بفحص سريع لك (كمرجع) وسجلت الدخول إلى منتدى تجريبي بصفتي عضوًا في الطاقم، واستخرجت مجموعة ```staff``، وحصلت على النتائج المتوقعة:

كائن JSON لمجموعة الطاقم بواسطة عضو في الطاقم
{
  "group": {
    "id": 3,
    "automatic": true,
    "name": "staff",
    "display_name": "staff",
    "user_count": 1,
    "mentionable_level": 0,
    "messageable_level": 0,
    "visibility_level": 1,
    "automatic_membership_email_domains": null,
    "primary_group": false,
    "title": null,
    "grant_trust_level": null,
    "incoming_email": null,
    "has_messages": false,
    "flair_url": null,
    "flair_bg_color": null,
    "flair_color": null,
    "bio_raw": null,
    "bio_cooked": null,
    "bio_excerpt": null,
    "public_admission": false,
    "public_exit": false,
    "allow_membership_requests": false,
    "full_name": null,
    "default_notification_level": 3,
    "membership_request_template": null,
    "is_group_user": true,
    "is_group_owner": true,
    "members_visibility_level": 0,
    "can_see_members": true,
    "publish_read_state": false,
    "is_group_owner_display": false,
    "mentionable": false,
    "messageable": false
  },
  "extras": {
    "visible_group_names": [
      "admins",
      "moderators",
      "staff",
      "trust_level_0",
      "trust_level_1",
      "trust_level_2",
      "trust_level_3",
      "trust_level_4"
    ]
  }
}

… كما جربت إجراء نفس العملية دون تسجيل الدخول، وحصلت على النتيجة المتوقعة:

{"errors":["ليس لديك إذن لعرض المورد المطلوب."],"error_type":"invalid_access"}

إذًا، هذا يعني، أو على ما يبدو لي، أن كل شيء يعمل كما ينبغي.

للعلم @JQ331، لم أكن بحاجة إلى مفتاح واجهة برمجة التطبيقات (API key) لهذا الإجراء بصفتي مستخدمًا مسجل الدخول (من المتصفح).

    "is_group_owner": true,

@neounix: شكرًا جزيلاً على ردك. لقد أوقف هذا بحثي الدؤوب عن السبب. كنت أعتقد أن سبب استلام استجابة “غير مصرّح بها” هو مشكلة في المصادقة.

اتضح أنك محق؛ لا توجد حاجة لمفتاح API لهذا الإجراء. بل كانت المشكلة في خطأ برمجي (بسيط)، وهو أمر واضح من الكود الذي نشرته أعلاه، لكنني كنت قد أغفلته سابقًا (كنت أضع اسم المتغير الخاص بعنوان AJAX بشكل خاطئ).

إليك الكود الذي يعمل الآن:

var groupName = [اسم المجموعة ذي الصلة]
var token = [الرمز الذي قمت بتوليده]
$.ajax({
     url: 'https://myforum.com/groups/' + groupName + '.json',    //هذا هو المكان الذي كان فيه الخطأ السابق
      contentType: "application/json",
        dataType: 'json',
        success: function(result){
             console.log('full response = ' + JSON.stringify(result));
             console.log('is group owner = ' + result.group.is_group_owner);  //لاحظ أن هذا سيكون إما true أو null           
     }
})

كنت أحصل على استجابة “غير مصرّح بها” سابقًا، لأن عنوان URL السابق الذي كنت أدخله يحتوي على اسم مجموعة غير صحيح (كان يُقرأ كـ “groupName”).