كيف تمرر مصفوفة إلى الـ API

في بعض استدعاءات واجهة برمجة التطبيقات (API)، يُتوقع منك تمرير مصفوفة من القيم ضمن بيانات الطلب (POST). كيف يمكنك فعل ذلك؟

تمكنتُ من خلال التجربة والخطأ من معرفة كيفية تمرير مصفوفة تحتوي على عنصر واحد - على سبيل المثال، في عملية تغيير المالك (change-owner)، تريد شيئًا مثل:

username: sean-finnegan
post_ids[]: 925

(أو، بصيغة مشفرة عبر الرابط)

post_ids%5B%5D=925&username=sean-finnegan

سؤال رائع، وأوافق على أن الأمر قد يكون محيرًا بعض الشيء. إذا كنت ترغب في تمرير معرفات منشورات متعددة، فقم بإدراج حقول بيانات نموذجية متعددة لـ post_ids[] مثل مثال curl التالي:

curl -i -sS -X POST "http://localhost:8080/t/15/change-owner.json" 
-H "Api-Key: api-key" \
-H "Api-Username: system" \
-F "username=blake" \
-F "post_ids[]=29" \
-F "post_ids[]=30"

مرحبًا بليك،

هل لا تزال هذه هي الطريقة الموصى بها لإرسال مصفوفة إلى واجهة برمجة التطبيقات؟ أحاول إنشاء نقطة ربط ويب ولا أستطيع إرسال معلمة مصفوفة web_hook_event_type_ids.

لقد جربتها باستخدام CURL (كـ multipart/form-data)

curl -X POST "https://MYSITE.com/admin/api/web_hooks" \
  -H "Api-Key: KEY" \
  -H "Api-Username: USER" \
  -F "payload_url=https://MYOTHERSITE.com" \
  -F "content_type=1" \
  -F "wildcard_web_hook=false" \
  -F "verify_certificate=true" \
  -F "active=true" \
  -F "web_hook_event_type_ids[]=2"

# أحصل على
{"errors":["param is missing or the value is empty: web_hook"]}%

وباستخدام httpie (كـ application/json):

http POST https://MYSITE.com/admin/api/web_hooks \
  Api-Key:KEY \
  Api-Username:USER \
  payload_url=https://MYOTHERSITE.com \
  content_type=1 \
  wildcard_web_hook:=false \
  verify_certificate:=true \
  active:=true \
  web_hook_event_type_ids:='[2]'

# أحصل على
{
    "errors": [
        "Web hook event types can't be blank"
    ]
}

يبدو أن هذا الطرفية بالكامل تتطلب القيم في معلمة web_hook متداخلة:

لست معجبًا جدًا بهذا التنسيق المتداخل، وهناك عدة نقاط نهاية مشابهة مدرجة في قائمتي المستقبلية للإصلاح. يمكنك إجراء استدعاء API باستخدام بيانات النموذج (form-data) على النحو التالي:

لاحظ كيف أن كل معلمة تستخدم بناء جملة “المصفوفة” web_hook[payload_url]. إذا كنت ترسل طلبك بتنسيق JSON، فسيظهر على النحو التالي:

{
  "web_hook": {
    "payload_url": "https://example.com/hello",
    "content_type": "1",
    ...
  }
} 

آه، شكرًا جزيلاً لك. لم يكن ذلك ما ورد في Discourse API، لذا كنت أشعر بالجنون. :sweat_smile:

أيضًا، لاحظت أن تعيين web_hook_event_type_ids إلى عنصر واحد على الأقل مطلوب حتى لو انتهيت باستخدام wildcard_web_hook=true. هذا أيضًا جعلني أحك رأسي لفترة من الوقت.