JSON-RPC
JSON-RPC ( تدوين كائنات جافا سكريبت - استدعاء الإجراءات عن بُعد ) هو بروتوكول اتصال قائم على JSON لاستدعاء الإجراءات عن بُعد (RPC). وهو مشابه لبروتوكول XML-RPC ، مع اختلاف بسيط في أنواع البيانات والأوامر. يسمح JSON-RPC بإرسال الإشعارات (بيانات تُرسل إلى الخادم دون الحاجة إلى رد) وإرسال عدة استدعاءات إلى الخادم، والتي قد يتم الرد عليها بشكل غير متزامن.
بروتوكول JSON-RPC مستقل عن بروتوكول النقل ويمكن نقله عبر العديد من بروتوكولات نقل البيانات المختلفة، بما في ذلك إدخال /إخراج واصفات الملفات ، و HTTP ، و TCP . وهو لا يوفر أي دعم مباشر للمصادقة أو التخويل.
تاريخ
| إصدار | وصف | مؤرخ |
|---|---|---|
| 1.0 | النسخة الأصلية | 2005 |
| 1.1 WD | مسودة عمل . تضيف معلمات مسماة، وتضيف رموز خطأ محددة، وتضيف وظائف استبطان. | 2006-08-07 |
| 1.1 بديل | اقتراح لبروتوكول JSON-RPC 1.1 بسيط . اقتراح بديل لبروتوكول WD 1.1. | 2007-05-06 |
| 1.1 مواصفات الكائن | مواصفات الكائن . اقتراح بديل للإصدار 1.1 WD/1.1ALT. | 30-07-2007 |
| 1.2 | اقتراح . تمت إعادة تسمية نسخة لاحقة من هذه الوثيقة إلى 2.0. | 27-12-2007 |
| 2.0 | مقترح المواصفات | 24-05-2009 |
| 2.0 (معدل-) | مواصفة | 2010-03-26 |
الاستخدام
يعمل بروتوكول JSON-RPC عن طريق إرسال طلب إلى خادم يُطبّق هذا البروتوكول. في هذه الحالة، يكون العميل عادةً برنامجًا يُريد استدعاء دالة واحدة من نظام بعيد. يُمكن تمرير مُدخلات مُتعددة إلى الدالة البعيدة على شكل مصفوفة أو كائن، كما يُمكن للدالة نفسها إرجاع مُخرجات مُتعددة. (يعتمد هذا على الإصدار المُطبّق).
جميع أنواع التحويل عبارة عن كائنات مفردة، يتم تسلسلها باستخدام JSON. [ 1 ]
طلب
الطلب هو استدعاء لطريقة محددة يوفرها نظام بعيد. ويمكن أن يحتوي على ثلاثة عناصر:
method- سلسلة نصية تحتوي على اسم الدالة المراد استدعاؤها. أسماء الدوال التي تبدأ بـ "rpc." محجوزة للدوال الداخلية لـ rpc.params- كائن أو مصفوفة من القيم يتم تمريرها كمعاملات إلى الدالة المحددة. يمكن حذف هذا العنصر.id- سلسلة نصية أو رقم غير كسري يُستخدم لمطابقة الاستجابة مع الطلب الذي ترد عليه. [ 2 ] يمكن حذف هذا العنصر إذا لم يكن من المفترض إرجاع أي استجابة. [ 3 ]
إجابة
يجب على متلقي الطلب الردّ بردٍّ صحيح على جميع الطلبات الواردة. يمكن أن يتضمن الردّ العناصر المذكورة أدناه.
result- البيانات التي تُرجعها الدالة المستدعاة. إذا حدث خطأ أثناء استدعاء الدالة، فلا يجب أن يكون هذا العنصر موجودًا. [ 4 ]error- كائن خطأ في حال حدوث خطأ أثناء استدعاء الدالة، وإلا فلا يجب أن يكون هذا العنصر موجودًا. [ 5 ] يجب أن يحتوي الكائن على العنصرين code ( عدد صحيح ) و message (نص). [ 6 ] يمكن أن يحتوي عنصر البيانات الاختياري على بيانات إضافية خاصة بالخادم. توجد رموز خطأ مُعرَّفة مسبقًا تتبع تلك المُعرَّفة لـ XML-RPC.id- معرف الطلب الذي يتم الاستجابة له.
| رمز الخطأ | رسالة | وصف |
|---|---|---|
| -32700 | خطأ في التحليل | تم استلام بيانات JSON غير صالحة |
| -32600 | طلب غير صالح | كائن JSON المرسل ليس كائن طلب صالحًا |
| -32601 | لم يتم العثور على الطريقة | الطريقة غير موجودة / غير متاحة |
| -32602 | معلمات غير صالحة | معلمات الطريقة غير صالحة |
| -32603 | خطأ داخلي | خطأ داخلي في JSON-RPC |
| من -32000 إلى -32099 | خطأ في الخادم | مخصص لأخطاء الخادم المحددة في التنفيذ |
نظرًا لوجود حالات لا تتطلب استجابة، بل ولا يُفضّل فيها ذلك، فقد تمّ استحداث الإشعارات. يُشبه الإشعار الطلب باستثناء المعرّف، الذي لا حاجة إليه لعدم وجود استجابة. في هذه الحالة، idيجب حذف الخاصية (الإصدار 2.0) أو تركها null(الإصدار 1.0).
أمثلة
في هذه الأمثلة، -->يشير الرمز إلى البيانات المُرسلة إلى خدمة ( طلب )، بينما <--يشير الرمز إلى البيانات الواردة من خدمة. على الرغم من <--أن يُطلق عليه غالبًا اسم استجابة في الحوسبة بين العميل والخادم ، إلا أنه اعتمادًا على إصدار JSON-RPC، لا يعني بالضرورة أنه رد على طلب .
الإصدار 2.0
الطلب والرد:
-- > { "jsonrpc" : "2.0" , "method" : "subtract" , "params" : { "minuend" : 42 , "subtrahend" : 23 }, "id" : 3 } < -- { "jsonrpc" : "2.0" , "result" : 19 , "id" : 3 }إشعار (بدون رد، وبدون معرف):
-- > { "jsonrpc" : "2.0" , "method" : "update" , "params" : [ 1 , 2 , 3 , 4 , 5 ]}خطأ في التحليل:
-- > { "jsonrpc" : "2.0" , "method" : "subtract" , "params" : < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32700 , "message" : "خطأ في التحليل" }, "id" : null }طلب غير صالح:
-- > { "jsonrpc" : "2.0" , "method" : 1 , "params" : "bar" } < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32600 , "message" : "طلب غير صالح" }, "id" : null }لم يتم العثور على الطريقة:
-- > { "jsonrpc" : "2.0" , "method" : "foobar" , "id" : 1 } < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32601 , "message" : "الطريقة غير موجودة" }, "id" : 1 }معلمات غير صالحة:
-- > { "jsonrpc" : "2.0" , "method" : "subtract" , "params" : { "minuend" : 42 }, "id" : 2 } < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32602 , "message" : "معاملات غير صالحة" , "data" : "المعامل المطلوب مفقود: subtrahend" }, "id" : 2 }خطأ داخلي:
-- > { "jsonrpc" : "2.0" , "method" : "getData" , "params" : [], "id" : 4 } < -- { "jsonrpc" : "2.0" , "error" : { "code" : -32603 , "message" : "خطأ داخلي" }, "id" : 4 }طلب مجمع مع وجود أخطاء:
-- > [ { "jsonrpc" : "2.0" , "method" : "subtract" , "params" : [ 42 , 23 ], "id" : 1 }, { "jsonrpc" : "2.0" , "method" : "foobar" , "id" : 2 }, { "foo" : "bar" } ] < -- [ { "jsonrpc" : "2.0" , "result" : 19 , "id" : 1 }, { "jsonrpc" : "2.0" , "error" : { "code" : -32601 , "message" : "الطريقة غير موجودة" }, "id" : 2 }, { "jsonrpc" : "2.0" , "error" : { "code" : -32600 , "message" : "طلب غير صالح" }, "id" : null } ]الإصدار 1.1 (مسودة عمل)
الطلب والرد:
-- > { "version" : "1.1" , "method" : "confirmFruitPurchase" , "params" : [[ "apple" , "orange" , "mangoes" ], 1.123 ], "id" : "194521489" } < -- { "version" : "1.1" , "result" : "done" , "error" : null , "id" : "194521489" }الإصدار 1.0
الطلب والرد:
-- > { "method" : "echo" , "params" : [ "Hello JSON-RPC" ], "id" : 1 } < -- { "result" : "Hello JSON-RPC" , "error" : null , "id" : 1 }انظر أيضاً
- gRPC - بروتوكول RPC ثنائي متعدد المنصات
- SOAP - بروتوكول مراسلة
- JSON-WSP - بروتوكول مستوحى من JSON-RPC مع مواصفات وصف الخدمة
- بروتوكول سياق النموذج - يستخدم JSON-RPC لدمج وكلاء الذكاء الاصطناعي مع الأدوات الخارجية [ 7 ]
مراجع
- ↑ "المواصفات - JSON-RPC - Trac" . مؤرشف من الأصل بتاريخ 17-05-2008 . تم الاطلاع عليه بتاريخ 14-05-2008 .
- ↑ "مواصفات JSON-RPC 2.0" .
id: مُعرِّف يُنشئه العميل، ويجب أن يحتوي على قيمة نصية أو رقمية أو فارغة (NULL) إذا تم تضمينه. إذا لم يتم تضمينه، يُفترض أنه إشعار. لا ينبغي أن تكون القيمة فارغة (NULL) عادةً، ويجب ألا تحتوي الأرقام على أجزاء كسرية.
- ↑ "مواصفات JSON-RPC 2.0" .
الإشعار هو كائن طلب بدون عنصر "id". يشير كائن الطلب الذي هو إشعار إلى عدم اهتمام العميل بكائن الاستجابة المقابل، وبالتالي لا يلزم إرجاع أي كائن استجابة إلى العميل. يجب على الخادم عدم الرد على الإشعارات، بما في ذلك تلك الموجودة ضمن طلب مجمع. الإشعارات غير قابلة للتأكيد بحكم تعريفها، لأنها لا تحتوي على كائن استجابة ليتم إرجاعه. وبالتالي، لن يكون العميل على دراية بأي أخطاء (مثل "معاملات غير صالحة" أو "خطأ داخلي").
- ↑ "مواصفات JSON-RPC 2.0" .
النتيجة: هذا العنصر مطلوب في حالة النجاح. يجب ألا يكون هذا العنصر موجودًا في حالة حدوث خطأ أثناء استدعاء الدالة. يتم تحديد قيمة هذا العنصر بناءً على الدالة المستدعاة على الخادم.
- ↑ "مواصفات JSON-RPC 2.0" .
خطأ: هذا العنصر مطلوب في حالة الخطأ. يجب ألا يكون هذا العنصر موجودًا إذا لم يحدث أي خطأ أثناء الاستدعاء. يجب أن تكون قيمة هذا العنصر كائنًا كما هو مُعرَّف في القسم 5.1.
- ↑ "مواصفات JSON-RPC 2.0" .
كائن الخطأ: عند مواجهة استدعاء RPC لخطأ، يجب أن يحتوي كائن الاستجابة على عنصر الخطأ بقيمة كائن تتضمن العناصر التالية: (code) - رقم يشير إلى نوع الخطأ الذي حدث. يجب أن يكون هذا الرقم صحيحًا. (message) - سلسلة نصية تقدم وصفًا موجزًا للخطأ. يُفضل أن تقتصر الرسالة على جملة واحدة مختصرة. (data) - قيمة أولية أو مُهيكلة تحتوي على معلومات إضافية حول الخطأ. يمكن حذف هذا العنصر. يتم تحديد قيمة هذا العنصر بواسطة الخادم (مثل معلومات الخطأ التفصيلية، والأخطاء المتداخلة، وما إلى ذلك).
- ↑ https://modelcontextprotocol.io/docs/learn/architecture
روابط خارجية
- الموقع الرسمي

- مجموعة جوجل JSON-RPC تناقش مواضيع البروتوكول وما يتعلق به
- مواصفات JSON-RPC، وMNlinks، وما إلى ذلك.
- وصف نقل HTTP لـ JSON-RPC-2
- مواصفات OpenRPC: تنسيق وصف الخدمة لـ JSON-RPC. (واجهة برمجة تطبيقات مفتوحة، ولكن لـ JSON-RPC)
- JSend - مواصفات مماثلة تحدد فقط تنسيق الاستجابة
- JSON
- خدمات الويب
- إجراء مكالمة عن بعد
