رقعة (HTTP)
في مجال الحوسبة، تُعدّ طريقة PATCH إحدى طرق طلب HTTP لإجراء تغييرات جزئية على مورد موجود. [ 1 ] تُقدّم طريقة PATCH كيانًا يحتوي على قائمة بالتغييرات المراد تطبيقها على المورد المطلوب باستخدام مُعرّف الموارد الموحد (URI) الخاص بـ HTTP. [ 1 ] تُقدّم قائمة التغييرات في شكل مستند PATCH. [ 1 ] إذا لم يكن المورد المطلوب موجودًا، فقد يقوم الخادم بإنشائه بناءً على نوع وسائط مستند PATCH والأذونات. [ 1 ] يجب أن تكون التغييرات الموصوفة في مستند PATCH مُحدّدة دلاليًا بشكل جيد، ولكن يمكن أن يكون لها نوع وسائط مختلف عن المورد الذي يتم تعديله. [ 2 ] يمكن استخدام لغات مثل XML أو JSON لوصف التغييرات في مستند PATCH.
تاريخ باتش
وفقًا للدلالات المحددة في بروتوكول HTTP ، تتطلب طرق GET و PUT و POST استخدام تمثيل كامل للمورد. طريقة PUT، التي تُستخدم لإنشاء الموارد أو استبدالها، هي طريقة متكررة النتائج ، ولا يمكن استخدامها إلا للتحديثات الكاملة. تتطلب نماذج التحرير المستخدمة في تطبيقات Ruby on Rails التقليدية إنشاء موارد جديدة من خلال تطبيق تحديثات جزئية على مورد رئيسي. لهذا السبب، أُضيفت طريقة PATCH إلى بروتوكول HTTP في عام 2010. [ 3 ] [ 4 ]
وضع مقابل تصحيح مقابل نشر
يُعدّ بروتوكول HTTP أساسًا لتبادل البيانات على شبكة الإنترنت العالمية . وهو بروتوكول طلب واستجابة يُساعد المستخدمين على التواصل مع الخادم لإجراء عمليات CRUD . يُعرّف بروتوكول HTTP عددًا من طرق الطلب مثل PUT و POST وPATCH لإنشاء الموارد أو تحديثها. [ 5 ]
يتمثل الفرق الرئيسي بين طريقتي PUT و PATCH في أن طريقة PUT تُرسل نسخة مُعدّلة من المورد المطلوب لتحل محل النسخة الأصلية، بينما تُرسل طريقة PATCH مجموعة من التعليمات لتعديل المورد. إذا كان حجم ملف PATCH أكبر من حجم النسخة الجديدة من المورد المُرسلة بواسطة طريقة PUT ، فإن طريقة PUT هي المُفضّلة. [ 1 ]
يمكن استخدام طريقة POST لإرسال تحديثات جزئية إلى مورد. الفرق الرئيسي بين طريقتي POST و PATCH هو أن طريقة POST لا تُستخدم إلا إذا كُتبت لدعم التطبيقات أو إذا كانت التطبيقات تدعم دلالاتها، بينما يمكن استخدام طريقة PATCH بشكل عام ولا تتطلب دعمًا من التطبيق. إذا كانت نتيجة استخدام طريقة PATCH غير معروفة، يُفضل استخدام طريقة POST. [ 1 ] [ 6 ]
ترقيع الموارد
تُعدّ طريقة PATCH عملية ذرية . [ 1 ] إما أن تُطبّق جميع التغييرات المحددة بواسطة طريقة PATCH، أو لا يُطبّق الخادم أيًا منها. [ 1 ] توجد طرق عديدة للتحقق من نجاح تطبيق التصحيح. على سبيل المثال، يمكن استخدام أداة 'diff' لمقارنة الإصدار الأقدم والإصدار الأحدث من الملف للعثور على الاختلافات بينهما. [ 1 ]
تُعتبر استجابة PATCH المخزنة مؤقتًا قديمة. ولا يمكن استخدامها إلا لطلبات GET وHEAD التي قد تلي طلب PATCH. [ 1 ]
لا تنطبق رؤوس الكيانات في مستند PATCH إلا على مستند PATCH نفسه، ولا يمكن تطبيقها على المورد المطلوب. [ 1 ]
لا يوجد تنسيق قياسي لوثيقة PATCH، ويختلف باختلاف أنواع الموارد. يجب على الخادم التحقق مما إذا كانت وثيقة PATCH المستلمة مناسبة للمورد المطلوب. [ 1 ]
سيبدو مستند JSON Patch كالتالي
[ { "op" : "add" , "path" : "/count" , "value" : 1 } ]يمثل "op" العملية التي تُجرى على المورد. ويمثل "path" المورد الذي يتم تعديله. ويمثل "value" القيمة المضافة إلى المورد الحالي. [ 7 ] قبل تطبيق التغييرات في مستند PATCH، يجب على الخادم التحقق مما إذا كان مستند PATCH المستلم مناسبًا للمورد المطلوب. إذا نجح طلب PATCH، فإنه يُعيد استجابة 204. [ 8 ]
سيبدو مستند XML PATCH كالتالي
<add sel= "doc/user[@email='xyz@abc.com']" type= "@address" > طريق ABC </add>يتم تحديد موقع العنصر <user> باستخدام السمة 'email'. وتُضاف سمة جديدة 'address' بقيمة "ABC Road" إلى العنصر <user>. [ 9 ]
مثال
مثال بسيط لطلب PATCH
PATCH/example.txtHTTP/1.1 المضيف: www.example.com نوع المحتوى: تطبيق/مثال شرط المطابقة : "c0b42b66e" طول المحتوى: 120 [ التغييرات : مستند التصحيح الذي يحتوي على جميع التغييرات التي يجب إجراؤها على ملف المثال example.txt]تم تنفيذ عملية تصحيح ناجحة لملف نصي موجود:
HTTP/1.1204No Content Content-Location: /example.txt ETag : "dd541480"يشير الرد 204 إلى أن الطلب قد تمت معالجته بنجاح. [ 10 ]
المفاضلات بين خياري PUT و PATCH
يستهلك استخدام طريقة PUT نطاقًا تردديًا أكبر مقارنةً بطريقة PATCH عند الحاجة إلى تطبيق تغييرات قليلة على مورد ما. ولكن عند استخدام طريقة PATCH، فإنها تتضمن عادةً جلب المورد من الخادم، ومقارنة الملف الأصلي بالملف الجديد، وإنشاء ملف diff وإرساله. من جانب الخادم، عليه قراءة ملف diff وإجراء التعديلات. وهذا يُضيف عبئًا كبيرًا مقارنةً بطريقة PUT. [ 11 ] من ناحية أخرى، تتطلب طريقة PUT تنفيذ طلب GET قبل PUT ، ويصعب ضمان عدم تعديل المورد بين طلبي GET و PUT .
حذر
لا تعتبر طريقة PATCH "آمنة" بالمعنى المقصود في RFC 2616: فقد تقوم بتعديل الموارد، وليس بالضرورة تلك المذكورة في URI . [ 1 ]
لا تُعتبر طريقة PATCH طريقةً مُستنسخة . يُمكن جعلها كذلك باستخدام طلب مشروط. [ 1 ] عندما يُرسل العميل طلبًا مشروطًا إلى مورد، ينجح الطلب فقط إذا لم يتم تحديث المورد منذ آخر مرة وصل إليها العميل. يُساعد هذا أيضًا في منع تلف المورد، حيث لا يُمكن إجراء بعض التحديثات على المورد إلا بدءًا من نقطة أساسية مُحددة. [ 1 ]
معالجة الأخطاء
قد يفشل طلب PATCH في حالة حدوث أي من الأخطاء التالية:
مستند تصحيح غير صحيح
يُعيد الخادم استجابة 400 (طلب غير صالح) إذا لم يكن مستند PATCH مُنسقًا بالشكل المطلوب. [ 1 ]
وثيقة تصحيح غير مدعومة
يُعيد الخادم استجابة 415 ( نوع وسائط غير مدعوم ) مع ترويسة استجابة Accept-Patch تحتوي على أنواع الوسائط المدعومة عندما يُرسل العميل مستند تصحيح بتنسيق غير مدعوم من قِبل الخادم. يُعلم هذا العميل بأن مستند التصحيح المُرسل من قِبله لا يمكن تطبيقه على المورد المطلوب. [ 1 ]
طلب غير قابل للمعالجة
يُعيد الخادم استجابة 422 (كيان غير قابل للمعالجة) عندما يفهم الخادم مستند PATCH ولكنه غير قادر على تعديل المورد المطلوب إما لأنه يتسبب في جعل المورد غير صالح أو لأنه ينتج عنه حالة خطأ أخرى. [ 1 ]
لم يتم العثور على المورد
يُعيد الخادم استجابة 404 (غير موجود) عندما يتعذر تطبيق مستند PATCH على مورد غير موجود. [ 1 ]
دولة متنازعة
يُعيد الخادم استجابة 409 (تعارض) عندما يتعذر عليه تطبيق تصحيح للحالة الحالية للمورد. [ 1 ]
تعديل متعارض
يُعيد الخادم استجابة 412 (فشل الشرط المسبق) عندما يفشل الشرط المسبق الذي يُقدّمه العميل باستخدام ترويسة If-Match أو If-Unmodified-Since. في حال عدم تقديم أي شرط مسبق ووجود تعديل مُتعارض، يُعيد الخادم استجابة 409 (تعارض). [ 1 ]
التعديل المتزامن
يُعيد الخادم استجابة 409 (تعارض) إذا كانت طلبات PATCH لمورد معين تتطلب ترتيبًا محددًا، وكان الخادم غير قادر على معالجة طلبات PATCH المتزامنة. [ 1 ]
الاعتبارات الأمنية
يتطلب طلب PATCH استخدام آليات مثل الطلبات المشروطة باستخدام Etags ورأس طلب If-Match لضمان عدم تلف البيانات أثناء عملية التحديث. [ 1 ] في حالة فشل طلب PATCH أو فشل القناة أو انتهاء المهلة، يمكن للعميل استخدام طلب GET للتحقق من حالة المورد. [ 1 ] يجب على الخادم ضمان عدم استخدام العملاء الضارين لطريقة PATCH لاستهلاك موارد الخادم بشكل مفرط. [ 1 ]
مراجع
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 دوسولت، ل.؛ سنيل، ج. (2010). "طريقة PATCH لبروتوكول HTTP" . doi : 10.17487/RFC5789 . S2CID 42062521. تاريخ الاسترجاع: 12 سبتمبر 2015 .
{{cite journal}}يتطلب الاستشهاد بالمجلة ( مساعدة )|journal= - ↑ "لا تُصلح كالأحمق" . لا تُصلح كالأحمق . ١٤ فبراير ٢٠١٤. تم الاطلاع عليه بتاريخ ١٦ سبتمبر ٢٠١٥ .
- ↑ RFC 5789
- ↑ "تاريخ باتش" . weblog.rubyonrails.org . تم الاطلاع عليه بتاريخ 25 سبتمبر 2015 .
- ↑ "بروتوكول نقل النص التشعبي - HTTP/1.1" . تم الاطلاع عليه بتاريخ 13 سبتمبر 2015 .
- ↑ "لماذا يُعدّ PATCH مفيدًا لواجهة برمجة تطبيقات HTTP الخاصة بك" . لماذا يُعدّ PATCH مفيدًا لواجهة برمجة تطبيقات HTTP الخاصة بك . تم الاطلاع عليه بتاريخ 16 سبتمبر 2015 .
- ↑ "JSON Patch - draft-ietf-appsawg-json-patch-08" . Ietf Datatracker . تم الاطلاع عليه بتاريخ 13 سبتمبر 2015 .
- ↑ "PATCH" . وثائق MDN على الويب . تم الاطلاع عليه بتاريخ 11-10-2018 .
- ↑ أوربالاينن، ج. (2008). "XML RFC" . tools.ietf.org . doi : 10.17487/RFC5261 . تم الاطلاع عليه بتاريخ 25 سبتمبر 2015 .
- ↑ "PATCH" . وثائق MDN على الويب . تم الاسترجاع في 12-10-2018 .
- ↑ دارين (7 مايو 2014). "أفضل ممارسات واجهة برمجة تطبيقات REST 3: التحديثات الجزئية - PATCH مقابل PUT" . www.blogger.com . تاريخ الاطلاع: 13 سبتمبر 2015 .
- بروتوكول نقل النص التشعبي
