مرحبًا أيها الأصدقاء، هل يمكنني استخدام application/json كـ Content-Type عند تحديث منشور عبر واجهة برمجة التطبيقات؟ تشير التوثيق إلى أن ذلك ممكن، لكنني بدأت أظن أنني لا أستطيع ذلك..
أحصل باستمرار على رسالة [\"BAD CSRF\"] ولا أدري ما تعنيه.
إذا كان علي استخدام multipart/form-data، فهل لديكم أي تلميحات حول كيفية بناء طلب الـ PUT؟ خاصةً الجزء الخاص بـ data.
هذا أمر غريب جدًا، عندما قمت بتنسيق الرأس بالطريقة التي أوضحتها، حصلت على:
{"errors":["ليس لديك إذن لعرض المورد المطلوب. اسم مستخدم API أو المفتاح غير صالح."],"error_type":"invalid_access"}
إذا أضفت ["Authorization"]، فإن الأمر يعمل.
هذا لطلب GET بسيط، ولا يزال بإمكاني عدم تنفيذ PUT.
أتوقع أن يكون الرأس الذي يعمل لعملية واحدة فعالًا لجميع العمليات (بشرط أن يكون المفتاح عالميًا - وهو كذلك). لذا، أنا لست قلقًا بشأن الرأس في الوقت الحالي - أم يجب أن أكون؟
من المرجح أن هناك خطأ في تنسيق طلب الـ PUT الخاص بك، خاصةً إذا كان طلب الـ GET يعمل بينما تقوم بذلك بالطريقة الخاطئة مع رأس Authorization. يعمل طلب الـ GET لأنك لا تحتاج إلى أي تفويض لإجراء طلب الـ GET. نحن لا ننظر حتى إلى رأس Authorization إذا قمت بإرساله. ستعمل طلبات الـ GET إلى النقاط العامة بشكل صحيح دون أي رؤوس.
@pedroleaoc إليك عينة صغيرة من سكريبت بايثون توضح كيفية إجراء طلبات مصادقة وكيفية إرسال بيانات الطلب لطلبات PUT/POST.
# discourse-api-demo.py
import requests
from requests.structures import CaseInsensitiveDict
# طلب GET أساسي إلى عنوان URL عام، لا حاجة لرؤوس.
url = "http://localhost:3000/posts/10.json"
resp = requests.get(url)
print(resp.status_code)
print(resp.content)
# طلب GET إلى نقطة نهاية خاصة. هناك حاجة لرؤوس المصادقة.
url = "http://localhost:3000/admin/users/list/active.json"
headers = {'Api-Username': 'system', 'Api-Key': '5c1c57915e2...'}
resp = requests.get(url, headers=headers)
print(resp.status_code)
print(resp.content)
# طلب PUT مع جسم طلب
url = "http://localhost:3000/posts/10.json"
data = { 'raw': "منشور رائع، لكن إليك تحديثًا لجسم المنشور", 'edit_reason': "قمت بتغيير هذا لأنني أستطيع." }
resp = requests.put(url, headers=headers, json=data)
print(resp.status_code)
print(resp.content)
يرجى الاطلاع على منشوري أعلاه مباشرةً. يمكنك استخدام json=data بدلاً من تنسيق data=data في طلبك، وستقوم مكتبة requests في بايثون بالاعتناء بـ content-type تلقائيًا وتعيينه كـ application/json، وهو ما يجب عليك استخدامه.
رائع، لقد أصبحت قادرًا الآن على تعديل منشوري! شكرًا لك على مساعدتك!
لكن لا يزال هناك مشكلة واحدة فقط؛ المفتاح الذي أستخدمه هو global. عندما أحاول استخدام مفتاح يحتوي على أذونات write وread فقط، أحصل على الرسالة: You are not permitted to view the requested resource. The API username or key is invalid.. عندما أقوم بتعديل المنشور عبر واجهة المستخدم الرسومية، يبدو أن هناك طلب PUT إلى عنوان URL للموضوع (بجانب الطلب الذي يقوم فعليًا بتعديل المنشور posts/post_id.json)، ولا يمكنني تكرار ذلك باستخدام مفتاح API محدود، بل فقط باستخدام المفتاح global. ومع ذلك، لا أفهم سببًا يمنعني من تعديل المنشور عبر API حتى بدون هذا الطلب PUT الإضافي الذي يحدث في واجهة المستخدم الرسومية.
تعديل: تقنيًا، يغطي مفتاح API الخاص بي /t/:slug/:topic_id، وهو المكان الذي يشير إليه طلب PUT.