تحذير: تتعلق هذه الصفحة بواجهات برمجة التطبيقات القديمة من Google، وهي واجهات برمجة التطبيقات لبيانات Google؛ وهي مرتبطة فقط بواجهات برمجة التطبيقات المدرجة في دليل Google Data APIs، والتي تم استبدال العديد منها بواجهات برمجة تطبيقات أحدث. للحصول على معلومات حول واجهة برمجة تطبيقات جديدة، اطلع على وثائق واجهة برمجة التطبيقات الجديدة. للحصول على معلومات حول تفويض الطلبات باستخدام واجهة برمجة تطبيقات أحدث، اطلع على مصادقة حسابات Google وتفويضها.
يوضح هذا المستند بروتوكول Google Data الذي تستخدمه العديد من واجهات برمجة تطبيقات Google، بما في ذلك المعلومات حول شكل طلب البحث والشكل الذي تظهر به النتائج وما إلى ذلك.
لمزيد من المعلومات حول بروتوكول بيانات Google، اطلع على صفحة نظرة عامة على دليل مطور البرامج ومستند أساسيات البروتوكول.
الجمهور
هذا المستند موجه لأي شخص يريد فهم تفاصيل تنسيق وبروتوكول XML المستخدمين في واجهات برمجة التطبيقات التي تنفذ بروتوكول بيانات Google.
إذا كنت تريد فقط كتابة شفرة تستخدم واحدة من واجهات برمجة التطبيقات هذه، فلا تحتاج إلى معرفة هذه التفاصيل؛ وبدلاً من ذلك، يمكنك استخدام مكتبات العملاء المتعلقة بلغة معينة.
ولكن إذا كنت تريد فهم البروتوكول، فاقرأ هذا المستند. على سبيل المثال، قد ترغب في قراءة هذا المستند لمساعدتك في أي من المهام التالية:
- تقييم بنية بروتوكول Google Data
- الترميز باستخدام البروتوكول بدون استخدام مكتبات العملاء المتوفرة
- كتابة مكتبة عميل بلغة جديدة
يفترض هذا المستند أنك تفهم أساسيات XML ومساحات الأسماء والخلاصات المشتركة والطلبات GET
وPOST
وPUT
وDELETE
في HTTP، بالإضافة إلى مفهوم HTTP لـ "المورد". للحصول على مزيد من المعلومات حول هذه الأمور، يمكنك الاطلاع على قسم الموارد الإضافية في هذا المستند.
لا يعتمد هذا المستند على أية لغة برمجة محددة؛ حيث يمكنك إرسال رسائل بروتوكول بيانات Google واستلامها باستخدام أي لغة برمجة تتيح لك إصدار طلبات HTTP وتحليل الردود المستندة إلى XML.
تفاصيل البروتوكول
يصف هذا القسم تنسيق مستند Google Data Protocol وبنية طلب البحث.
تنسيق المستند
يتشارك كل من بروتوكول Google Data وAtom نموذج البيانات الأساسي نفسه: حاوية تحتوي على بعض البيانات العمومية وأي عدد من الإدخالات. بالنسبة إلى كل بروتوكول، يتم تحديد التنسيق من خلال مخطط أساسي، ولكن يمكن توسيعه باستخدام مساحات الأسماء الأجنبية.
Atom هو التنسيق الافتراضي لبروتوكول Google Data. ولطلب رد بتنسيق آخر، يمكنك استخدام معلمة طلب البحث alt
، وللحصول على مزيد من المعلومات، يمكنك الاطّلاع على طلبات البحث.
ملاحظة: تستخدم معظم خلاصات بروتوكول Google Data بتنسيق Atom مساحة الاسم Atom كمساحة اسم تلقائية من خلال تحديد سمة xmlns
في عنصر الخلاصة، كما هو موضح في الأمثلة الواردة في أساسيات البروتوكول. وبالتالي، لا تحدّد الأمثلة في هذا المستند atom:
بشكل واضح للعناصر في خلاصة بتنسيق Atom.
تعرض الجداول التالية تمثيل Atom لعناصر المخطط. يتم التعامل مع جميع البيانات غير المذكورة في هذه الجداول على أنها XML عادي. تتوفّر عناصر XML في عمود معيّن في مساحة اسم Atom ما لم يُذكر خلاف ذلك.
ملاحظة: يستخدم هذا الملخص تدوين XPath القياسي: وعلى وجه الخصوص، تعرض الشرطة المائلة العرض الهرمي للعنصر، وتشير العلامة @ إلى سمة للعنصر.
في كل من الجداول التالية، تكون العناصر المحددة مطلوبة.
يعرض الجدول التالي عناصر خلاصة بروتوكول بيانات Google:
عنصر مخطط الخلاصة | تمثيل Atom |
---|---|
عنوان الخلاصة | /feed/title |
الرقم التعريفي للخلاصة | /feed/id |
رابط HTML للخلاصة | /feed/link[@rel="alternate"] \[@type="text/html"]/@href |
وصف الخلاصة | /feed/subtitle |
لغة الخلاصة | /feed/@xml:lang |
حقوق طبع ونشر الخلاصة | /feed/rights |
مؤلف الخلاصة |
(مطلوب في حالات معينة، راجع مواصفات Atom.) |
تاريخ آخر تحديث للخلاصة | /feed/updated (تنسيق RFC 3339) |
فئة الخلاصة | /feed/category/@term |
مخطط فئة الخلاصة | /feed/category/@scheme |
منشئ الخلاصات | /feed/generator /feed/generator/@uri |
رمز الخلاصة | /feed/icon |
شعار الخلاصة | /feed/logo |
يعرض الجدول التالي عناصر خلاصة نتائج البحث في "بروتوكول بيانات Google". لاحظ أن البروتوكول يعرض بعض عناصر استجابة OpenSearch 1.1 في خلاصات نتائج البحث.
عنصر مخطط خلاصة نتائج البحث | تمثيل Atom |
---|---|
عدد نتائج البحث | /feed/openSearch:totalResults |
فهرس بدء نتائج البحث | /feed/openSearch:startIndex |
عدد نتائج البحث لكل صفحة | /feed/openSearch:itemsPerPage |
يعرض الجدول التالي عناصر إدخال بروتوكول بيانات Google:
عنصر مخطّط الإدخال | تمثيل Atom |
---|---|
معرِّف الإدخال | /feed/entry/id |
عنوان الإدخال | /feed/entry/title |
رابط الإدخال | /feed/entry/link |
ملخّص الاشتراك |
(مطلوب في حالات معينة، راجع مواصفات Atom.) |
محتوى المشاركة |
(في حال عدم توفّر عنصر محتوى، يجب أن يحتوي الإدخال على عنصر |
مؤلف المشاركة |
(مطلوب في حالات معينة، راجع مواصفات Atom.) |
فئة الاشتراك | /feed/entry/category/@term |
مخطط فئة المشاركة | /feed/entry/category/@scheme |
تاريخ نشر المشاركة | /feed/entry/published (RFC 3339) |
تاريخ تحديث الإدخال | /feed/entry/updated (RFC 3339) |
طلبات البحث
يصف هذا القسم كيفية استخدام نظام طلبات البحث.
مبادئ تصميم نموذج طلب البحث
نموذج طلب البحث بسيط جدًا عن قصد. المبادئ الأساسية هي:
- يتم التعبير عن طلبات البحث كمعرفات عناوين URI لبروتوكول HTTP، وليس كرؤوس HTTP أو كجزء من حمولة. ومن فوائد هذه الطريقة أنه يمكنك الربط بطلب بحث.
- يتم تحديد الإسنادات لعنصر واحد. وبالتالي، ليست هناك أي طريقة لإرسال طلب بحث عن ارتباط مثل "العثور على جميع الرسائل الإلكترونية من الأشخاص الذين أرسلوا لي 10 رسائل إلكترونية على الأقل اليوم".
- مجموعة المواقع التي يمكن أن تُعتمد عليها طلبات البحث محدودة للغاية؛ فمعظم طلبات البحث تكون ببساطة طلبات بحث نصية كاملة.
- والأمر متروك لآلية تنفيذ النتائج.
- البروتوكول قابل للتوسع بشكل طبيعي. إذا كنت تريد الكشف عن استنتاجات إضافية أو تصنيف في خدمتك، يمكنك إجراء ذلك بسهولة من خلال تقديم معلمات جديدة.
طلبات البحث
يستفسر العميل عن إحدى خدمات Google عن طريق إصدار طلب HTTP GET
. يتألف معرّف الموارد المنتظم (URI) لطلب البحث من معرّف الموارد المنتظم (URI) للمورد (يُسمى FeedURI في تنسيق Atom) متبوعًا بمعلّمات طلب البحث. ويتم تمثيل معظم معلمات طلبات البحث على أنها معلمات عناوين URL تقليدية في ?name=value[&...]
. يتم التعامل مع معلمات الفئة بشكل مختلف؛ انظر أدناه.
على سبيل المثال، إذا كان URIURI هو http://www.example.com/feeds/jo
، يمكنك إرسال طلب بحث باستخدام عنوان URI التالي:
http://www.example.com/feeds/jo?q=Darcy&updated-min=2005-04-19T15:30:00Z
يدعم بروتوكول بيانات Google بروتوكول HTTP المشروط GET
. تعمل واجهات برمجة التطبيقات التي تنفّذ البروتوكول على ضبط عنوان الاستجابة Last-Modified استنادًا إلى قيمة العنصر <atom:updated>
في الخلاصة أو الإدخال المعروض. يمكن للعميل إرسال هذه القيمة مرة أخرى كقيمة لرأس الطلب If-Modified-Since لتجنب استرداد المحتوى مرة أخرى إذا لم يتم تغييره. إذا لم يتغير المحتوى منذ وقت If-Modified-Since، فستعرض الخدمة استجابة HTTP 304 (لم يتم تعديلها).
يجب أن تدعم واجهات برمجة التطبيقات التي تنفذ بروتوكول بيانات Google طلبات بحث alt
، كما أن دعم المعلمات الأخرى اختياري. ويؤدي تمرير معلّمة عادية لا تفهمها خدمة معيّنة إلى الحصول على استجابة 403 Forbidden
. يؤدي تمرير معلمة غير قياسية غير متوافقة إلى استجابة 400 Bad Request
. للحصول على معلومات عن رموز الحالة الأخرى، راجع القسم رموز حالة HTTP في هذا المستند.
يتم تلخيص معلمات طلب البحث القياسية في الجدول التالي. يلزم تشفير جميع قيم المعلمات بعنوان URL.
المعلمة | المعنى | ملاحظات |
---|---|---|
alt |
نوع التمثيل البديل |
|
author |
مؤلف المشاركة |
|
category |
فلتر طلبات بحث الفئات |
|
/-/category |
فلتر طلبات بحث الفئات |
|
entryID | رقم تعريف إدخال محدّد لاسترداده |
|
fields |
فلتر الردود |
|
max-results |
الحد الأقصى لعدد النتائج المراد استردادها | بالنسبة إلى أي خدمة تحتوي على قيمة max-results تلقائية (لتقييد حجم الخلاصة التلقائية)، يمكنك تحديد عدد كبير جدًا إذا أردت تلقّي الخلاصة بأكملها. |
prettyprint |
لعرض استجابة XML تتضمّن هويات وفواصل أسطر |
|
published-min ، published-max |
القيود المفروضة على تاريخ نشر الإدخال |
|
q |
سلسلة طلب بحث عن النص الكامل |
|
start-index |
فهرس يستند إلى 1 للنتيجة الأولى المطلوب استردادها |
|
strict |
تحقق صارم من معلمة طلب البحث |
|
updated-min ، updated-max |
القيود المفروضة على تاريخ تحديث الإدخال |
|
حول طلبات البحث عن الفئة
قررنا توفير تنسيق غير مألوف إلى حد ما لطلبات بحث الفئة. بدلاً من طلب طلب بحث مثل ما يلي:
http://example.com/jo?category=Fritz&category=2006
جعلنا من الممكن استخدام:
http://example.com/jo/-/Fritz/2006
تحدد هذه الطريقة أحد الموارد بدون استخدام معامِلات طلب البحث، وتنتج معرّفات موارد منتظمة (URI) أكثر وضوحًا. لقد اخترنا هذا الأسلوب للفئات لأننا نعتقد أن طلبات البحث في الفئة ستكون من بين طلبات البحث الأكثر شيوعًا.
يتمثل سلبي هذا النهج في أننا نطالبك باستخدام /-/
في هذا النوع من طلبات البحث عن الفئة، حتى تتمكن الخدمات من تمييز طلبات البحث عن الفئة من مُعرّفات الموارد المنتظمة (URI) للموارد الأخرى، مثل http://example.com/jo/MyPost/comments
.
ردود طلب البحث
تعرض طلبات البحث خلاصة Atom أو إدخال بتنسيق Atom أو خلاصة RSS، بناءً على معلمات الطلب.
تحتوي نتائج طلبات البحث على عناصر OpenSearch التالية مباشرة ضمن العنصر <feed>
أو العنصر <channel>
(بناء على ما إذا كانت النتائج بتنسيق Atom أو RSS):
openSearch:totalResults
- إجمالي عدد نتائج البحث لطلب البحث (ليست كل النتائج موجودة في خلاصة النتائج).
openSearch:startIndex
- الفهرس المستند إلى الرقم 1 للنتيجة الأولى.
openSearch:itemsPerPage
- الحد الأقصى لعدد العناصر التي تظهر على صفحة واحدة. ويتيح هذا للعملاء إنشاء روابط مباشرة إلى أي مجموعة من الصفحات التالية. ومع ذلك، بالنسبة إلى المخاطر المحتملة في استخدام هذا الرقم، راجع الملاحظة بخصوص
start-index
في الجدول في قسم طلبات البحث.
قد تتضمن خلاصة استجابة Atom وإدخالاته أيًا من عناصر Atom وواجهة برمجة التطبيقات التالية (بالإضافة إلى العناصر الأخرى الواردة في مواصفات Atom):
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="..."/>
- يحدد هذا الإعداد معرّف الموارد المنتظم (URI) الذي يمكن استرداد خلاصة Atom كاملة إليه.
<link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="..."/>
- يحدد PostURI لخلاصة Atom (حيث يمكن نشر الإدخالات الجديدة).
<link rel="self" type="..." href="..."/>
- تحتوي على معرّف الموارد المنتظم (URI) لهذا المورد. وتعتمد قيمة السمة
type
على التنسيق المطلوب. إذا لم تتغير أي بيانات في هذه الفترة، فإن إرسال GET آخر إلى معرّف الموارد المنتظم هذا يؤدي إلى عرض الاستجابة نفسها. <link rel="previous" type="application/atom+xml" href="..."/>
- يحدد معرّف الموارد المنتظم للجزء السابق من مجموعة نتائج طلب البحث هذه، إذا كان مقسمًا.
<link rel="next" type="application/atom+xml" href="..."/>
- يحدد هذا الإعداد معرّف الموارد المنتظم للجزء التالي من مجموعة نتائج طلب البحث هذه، إذا كان مقسمًا.
<link rel="edit" type="application/atom+xml" href="..."/>
- يحدد هذا العنصر محرر قيم Atom لإدخال Atom (حيث ترسل إدخالاً محدّثًا).
في ما يلي نموذج لنص استجابة، استجابةً لطلب بحث:
<?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"C0QBRXcycSp7ImA9WxRVFUk."'> <id>http://www.example.com/feed/1234.1/posts/full</id> <updated>2005-09-16T00:42:06Z</updated> <title type="text">Books and Romance with Jo and Liz</title> <link rel="alternate" type="text/html" href="http://www.example.net/"/> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full"/> <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full"/> <link rel="self" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full"/> <author> <name>Elizabeth Bennet</name> <email>liz@gmail.com</email> </author> <generator version="1.0" uri="http://www.example.com">Example Generator Engine</generator> <openSearch:totalResults>2</openSearch:totalResults> <openSearch:startIndex>0</openSearch:startIndex> <entry gd:etag='W/"C0QBRXcycSp7ImA9WxRVGUo."'> <id>http://www.example.com/feed/1234.1/posts/full/4521614025009481151</id> <published>2005-01-09T08:00:00Z</published> <updated>2005-01-09T08:00:00Z</updated> <category scheme="http://www.example.com/type" term="blog.post"/> <title type="text">This is the title of entry 1009</title> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml">This is the entry body of entry 1009</div> </content> <link rel="alternate" type="text/html" href="http://www.example.com/posturl"/> <link rel="edit" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full/4521614025009481151"/> <author> <name>Elizabeth Bennet</name> <email>liz@gmail.com</email> </author> </entry> <entry gd:etag='W/"C0QBRXrurSp7ImA9WxRVGUo."'> <id>http://www.example.com/feed/1234.1/posts/full/3067545004648931569</id> <published>2005-01-07T08:00:00Z</published> <updated>2005-01-07T08:02:00Z</updated> <category scheme="http://www.example.com/type" term="blog.post"/> <title type="text">This is the title of entry 1007</title> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml">This is the entry body of entry 1007</div> </content> <link rel="alternate" type="text/html" href="http://www.example.com/posturl"/> <link rel="edit" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full/3067545004648931569"/> <author> <name>Elizabeth Bennet</name> <email>liz@gmail.com</email> </author> </entry> </feed>
إذا كانت الخلاصة المطلوبة بتنسيق Atom، وإذا لم يتم تحديد معلَمات طلب بحث، وإذا لم تكن النتيجة تحتوي على جميع الإدخالات، يتم إدراج العنصر التالي في خلاصة المستوى الأعلى: <link rel="next" type="application/atom+xml" href="..."/>
. وهو يشير إلى خلاصة تحتوي على المجموعة التالية من الإدخالات. تحتوي المجموعات اللاحقة على عنصر <link rel="previous" type="application/atom+xml" href="..."/>
مطابق. ومن خلال اتباع جميع الروابط التالية، يمكن للبرنامج استرداد جميع الإدخالات من الخلاصة.
رموز حالة HTTP
يوضح الجدول التالي معنى رموز حالة HTTP المختلفة في سياق واجهات برمجة التطبيقات للبيانات.
الرمز | الشرح |
---|---|
200 موافق | ليس هناك خطأ. |
201 تم الإنشاء | تم إنشاء المورد بنجاح. |
304 لم يتم التعديل | لم يتغير المورد منذ الوقت المحدد في رأس If-Modified-Since للطلب. |
400 طلب غير صالح | عنوان URI أو عنوان الطلب غير صالح أو معلمة غير قياسية غير مدعومة. |
401 غير مصرح | التخويل لازم. |
403 FORBIDDEN | معلمة قياسية غير معتمدة، أو أخفقت مصادقة أو تفويض. |
404 لم يتم العثور على الصفحة | لم يتم العثور على المورد (مثل خلاصة أو إدخال). |
409 تعارض | رقم الإصدار المحدد لا يطابق أحدث رقم إصدار للمورد. |
410 لم يعد متوفرًا | لم يعد سجل التغييرات المطلوب متوفرًا على الخادم. ارجع إلى الوثائق الخاصة بالخدمة للحصول على مزيد من التفاصيل. |
500 خطأ في الخادم الداخلي | حدث خطأ داخلي. وهذا هو الرمز الافتراضي المستخدم لجميع أخطاء الخادم غير المعروفة. |
تحديد إصدارات الموارد (ETags)
قد تحتاج أحيانًا إلى أن تتمكن من الرجوع إلى نسخة معينة من إدخال معين.
وهذا أمر مهم في حالتين على وجه الخصوص:
- إجراء "استرداد مشروط" يطلب فيه العميل إدخالاً، ويرسل الخادم الإدخال فقط إذا تم تغييره منذ آخر مرة طلبها العميل.
- ضمان عدم استبدال أكثر من عميل لتغييرات بعضهم البعض بدون قصد. وتنفذ واجهات برمجة التطبيقات للبيانات إجراء التحديثات والحذف في حالة تحديد العميل لمعرّف إصدار قديم للإدخال.
وتتعامل واجهات برمجة التطبيقات لبيانات Google مع هاتين الحالتين باستخدام ETags، وهي جزء قياسي من HTTP.
ETag هو معرّف يحدّد إصدارًا معيّنًا من إدخال معيّن. يُلحِق الخادم ETag بعناصر الإدخال والخلاصة التي يرسلها إلى العملاء. وعند تغير أي إدخال أو خلاصة، تتغير شفرة ETag أيضًا.
توفّر واجهات برمجة التطبيقات لبيانات Google أداة ETags في موضعين: في رأس HTTP ETag
، وفي سمة gd:etag
لعناصر <feed>
و<entry>
.
في واجهات برمجة التطبيقات لبيانات Google، عادةً ما تكون علامة ETag عبارة عن سلسلة من الأحرف والأرقام، وأحيانًا تتضمن الواصلات والنقاط؛ ويتم عادةً تضمين السلسلة بين علامتي اقتباس. (تعد علامات الاقتباس جزءًا من ETag.) على سبيل المثال، في ما يلي ملف ETag من إدخال واجهة برمجة التطبيقات للبيانات: "S0wCTlpIIip7ImA0X0QI"
.
هناك نوعان من علامات ETags: القوة والضعف. تحدد أداة ETags قوية إصدارًا محددًا من إدخال محدد، ويمكن استخدامها لتجنب استبدال تغييرات البرامج الأخرى. لا يتم استخدام أداة ETags الضعيفة في سياق واجهات برمجة التطبيقات للبيانات في Google إلا لاسترداد البيانات الشرطي. دائمًا ما تبدأ قيمة ETag الضعيفة بـ W/
. على سبيل المثال: W/"D08FQn8-eil7ImA9WxZbFEw."
لا تدعم بعض واجهات برمجة التطبيقات لبيانات Google أداة ETags قوية. وبالنسبة إلى الجهات التي تفعل ذلك، يتم استخدام أداة ETags القوية للإدخالات فقط، وتكون ETags في الخلاصات ضعيفة دائمًا.
في ما يلي مثال لخلاصة (بما في ذلك بعض رؤوس HTTP) تم استردادها من خدمة تتيح استخدام العلامات القوية:
GData-Version: 2.0 ETag: W/"C0QBRXcycSp7ImA9WxRVFUk." ... <?xml version='1.0' encoding='utf-8'?> <feed xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"C0QBRXcycSp7ImA9WxRVFUk."'> ... <entry gd:etag='"CUUEQX47eCp7ImA9WxRVEkQ."'> ... </entry> </feed>
وتتولى مكتبات العملاء التي تدعم الإصدار 2 من واجهات برمجة التطبيقات للبيانات التعامل مع أداة ETags بشفافية. المعلومات التالية مخصصة للعملاء الذين لا يستخدمون مكتبات العملاء، وللقراء المهتمين بكيفية تحديد الإصدارات على مستوى البروتوكول.
ملاحظة: للحصول على معلومات حول نظام إصدار الموارد المُستخدَم في الإصدار 1.0 من واجهات برمجة التطبيقات للبيانات، يُرجى الاطِّلاع على الدليل المرجعي 1.0.
الاسترجاع المشروط
إذا كنت تريد استرداد إدخال تم استرداده من قبل، فيمكنك تحسين الكفاءة من خلال مطالبة الخادم بإرسال الإدخال فقط إذا تم تغييره منذ آخر مرة استردتها فيها.
ولإجراء هذا النوع من الاسترجاع الشرطي، أرسِل طلب HTTP GET
يتضمن عنوان HTTP If-None-Match
. في العنوان، حدِّد ETag للإدخال.
في ما يلي مثال على عنوان If-None-Match
:
If-None-Match: W/"D08FQn8-eil7ImA9WxZbFEw."
عندما يتلقى الخادم هذا الطلب، فإنه يتحقق مما إذا كان الإدخال الذي طلبته يتطابق مع ETag نفسه الموجود في ETag الذي حددته. وفي حال تطابق ETags، لن يتم تغيير الإدخال وسيعرض الخادم رمز حالة HTTP 304 Not Modified
.
في حالة عدم تطابق قيم ETags، فهذا يعني أنه تم تعديل الإدخال منذ آخر مرة طلبت ذلك فيه، وسيعرض الخادم الإدخال.
تحديث الإدخالات
إن أسهل طريقة لتجنب استبدال تغييرات عميل آخر هي أن يقوم الخادم بالتحقق من أن الإدخال الذي بدأ العميل باستخدامه يتطابق مع الإصدار الحالي المخزن من قبل الخادم عندما يرسل البرنامج إدخالاً محدّثًا. إذا أجرى عميل ثانٍ تعديلاً قبل أن يُجري العميل تعديلاً، سيتم رفض تعديل ذلك العميل، لأن العميل لم يعد يعتمد تعديلاته على أحدث إصدار.
عندما يسترد العميل البيانات من خدمة تتيح استخدام أداة ETags القوية، يكون لكل إدخال ETag يعمل كمعرّف إصدار فريد لهذا الإصدار من ذلك الإدخال.
ملاحظة: لا تعمل عملية التعديل باستخدام أداة ETags إلا باستخدام علامات قوية. وبالنسبة إلى الخدمات التي توفر علامات ETags ضعيفة، فإن كل التحديثات تُحقّق نجاحًا، بغض النظر عما إذا كان شخص آخر قد حدّث الإدخال منذ أن استردته أم لا؛ فالتحديث الأخير يؤدي دائمًا إلى استبدال أي تحديثات سابقة. لذلك، لا ترسل علامات إلكترونية ضعيفة عند التحديث أو الحذف، وستحصل على رسالة خطأ إذا حدث ذلك.
لذا، عندما يرسل العميل تحديثًا إلى خدمة eTags قوية، سيحتاج إلى تحديد إصدار الإدخال الذي يتم تحديثه. هناك طريقتان لإجراء ذلك:
- استخدِم عنوان HTTP يتضمّن
If-Match
. - استخدِم السمة
gd:etag
في العنصر<atom:entry>
.
وننصح باتّباع نهج If-Match
إن أمكن.
لتحديث إدخال باستخدام If-Match
، ابدأ من خلال الحصول على الإدخال الذي تعمل على تحديثه. أجرِ أي تغييرات مطلوبة على الإدخال، ثم أنشئ طلب PUT
جديدًا يحتوي على الإدخال الذي تم تعديله. (للحصول على تفاصيل عناوين URL المراد استخدامها، راجع الوثائق المتعلقة بالخدمة.)
قبل إرسال PUT
، أضِف عنوان HTTP If-Match
يحتوي على ETag من الإدخال الأصلي:
If-Match: "S0wCTlpIIip7ImA0X0QI"
بعد ذلك، أرسِل طلب PUT
.
في حال نجاح التحديث، سيعرض الخادم رمز حالة HTTP 200 OK
ونسخة من الإدخال المُحدَّث.
إذا فشل التحديث لأن ETag الذي حددته لا يطابق ETag الحالي في الإدخال (الذي يشير ضمنًا إلى أن الإدخال قد تم تغييره على الخادم منذ آخر استرداد له)، فيعرض الخادم رمز حالة HTTP 412 Precondition Failed
.
إذا لم تتمكّن من كتابة عناوين HTTP بسهولة أو كان لديك سبب آخر لتجنُّب استخدام رأس If-Match
، يمكنك استخدام السمة gd:etag
بدلاً من ذلك.
إذا لم ترسل رأس If-Match
، يستخدم الخادم قيمة سمة gd:etag
المعدّلة كقيمة If-Match
ضمنية.
لإلغاء نظام تحديد الإصدارات وتحديث الإدخال بغض النظر عما إذا كان شخص آخر قد عدّله منذ استرداده، استخدم If-Match: *
بدلاً من تحديد ETag في الرأس.
للحصول على معلومات حول الخدمات التي تدعم ETags القوية، اطلع على دليل الترحيل.
جارٍ حذف الإدخالات
ويعمل حذف الإدخالات التي تستخدم أداة ETags القوية إلى حد كبير مثلما يحدث عند تحديثها.
لحذف إدخال يحتوي على ETag قوية، عليك أولاً استرداد الإدخال الذي تريد حذفه، ثم إرسال طلب DELETE
إلى عنوان URL لتعديل الإدخال.
إذا كنت تريد التأكّد من عدم حذف إدخال تم تغييره من قِبل عميل آخر منذ أن استردته، يمكنك تضمين عنوان HTTP If-Match
الذي يحتوي على قيمة ETag للإدخال الأصلي.
إذا أردت إلغاء نظام النسخ وحذف الإدخال بغض النظر عما إذا كان شخص آخر قد عدّله منذ استرداده، استخدم If-Match: *
بدلاً من تحديد ETag في الرأس.
إذا كان الإدخال لا يتضمن علامة ETag قوية، فسينجح طلب DELETE
دائمًا.
رد جزئي (تجريبي)
وبشكل افتراضي، يرسل الخادم التمثيل الكامل للمورد المستهدف بعد معالجة الطلبات. الاستجابة الجزئية يتيح لك طلب العناصر أو السمات محل الاهتمام فقط، بدلاً من التمثيل الكامل للموارد. ويتيح هذا لتطبيق العميل تجنب نقل الحقول غير الضرورية وتحليلها وتخزينها، حتى يتمكن من استخدام موارد الشبكة ووحدة المعالجة المركزية (CPU) والذاكرة بكفاءة أكبر.
لمعرفة ما إذا كانت الاستجابة الجزئية متوفرة للمنتج الذي تستخدمه، راجع وثائق واجهة برمجة التطبيقات.
لطلب رد جزئي، استخدم معلمة طلب البحث fields
لتحديد العناصر أو السمات التي تريد عرضها. في ما يلي مثال على ذلك:
http://www.example.com/feeds?fields=link,entry(@gd:etag,id,updated,link[@rel='edit']))
لا تحتوي استجابة الخادم إلا على عناصر الرابط والإدخال في الخلاصة فقط، أما عناصر الإدخال فتحتوي فقط على معرّف ETag والمعرّف المحدّثين وتعديل الرابط. تتم تغطية بنية معلَمة طلب البحث fields
في الأقسام التالية. لمزيد من التفاصيل حول الرد، اطلع على التعامل مع الردود الجزئية.
ملاحظة: يمكنك استخدام معلمة طلب البحث fields
مع أي طلب يعرض بيانات. بالإضافة إلى GET
، يتضمن ذلك POST
وPUT
(بالإضافة إلى PATCH
، والتي يتم استخدامها لإجراء تحديثات جزئية). ومع ذلك، تؤثر معلمة طلب البحث fields
في بيانات الاستجابة فقط، ولا تؤثر في البيانات التي يجب تقديمها أو الحقول التي يتم تحديثها أو إنشاؤها.
ملخّص بنية معلّمة الحقول
يستند تنسيق قيمة معلمة طلب البحث fields
إلى بنية XPath، غير أنه لا يدعم إلا مجموعة فرعية من تعبيرات XPath الصالحة. ويتم تلخيص البنية المتوافقة أدناه، كما يتم تقديم أمثلة إضافية في القسم التالي.
- استخدم قائمة مفصولة بفواصل لاختيار عدة حقول.
- استخدِم
a/b
لاختيار عنصرb
مدمج داخل العنصرa
، واستخدِمa/b/c
لاختيار عنصرc
مدمج داخلb
. - استخدم بادئة
'@'
لتحديد سمة بالاسم المُعطى، واحذف البادئة'@'
للإشارة إلى أحد العناصر. - طبِّق شروط الحقول لاختيار العناصر التي تطابق معايير معيّنة، من خلال وضع التعبيرات بين قوسين "
[ ]
" بعد العنصر الذي تريد تقييده.على سبيل المثال، لا تعرض الدالة
fields=entry[author/name='Elizabeth']
سوى إدخالات الخلاصة التي تكون نبيلة مؤلفة لها. - يمكنك تحديد محدِّدات فرعية للحقول لطلب سمات أو عناصر فرعية معينة فقط، من خلال وضع التعبيرات بين قوسين "
( )
" بعد أي عنصر محدد.على سبيل المثال، لا تعرض
fields=entry(id,author/email)
سوى رقم التعريف والبريد الإلكتروني للمؤلف لكل إدخال خلاصة. - ويمكنك تحديد السلاسل باستخدام علامات الاقتباس المزدوجة أو المفردة
.
لتخطي علامة اقتباس مزدوجة أو مفردة، كرِّر الاقتباس مرة أخرى. على سبيل المثال، تُنتج
"""Hello,"" he said"
السلسلة"Hello," he said
، وتُنتج'''Hello,'' he said'
السلسلة'Hello,' he said
. - يمكنك استخدام أحرف البدل في تحديدات الحقول.
على سبيل المثال، يحدد
entry/gd:*
جميع العناصر الفرعية للإدخال في مساحة الاسمgd
، ويحددentry/@gd:*
سمات العناصر الفرعية في مساحة الاسم نفسها.
تعمل معلمة طلب البحث fields
كفلتر للمخرجات. وهذا يعني أنه يتم حساب الاستجابة الجزئية فقط بعد معالجة بقية طلب البحث. على سبيل المثال، إذا حدّدت أيضًا معلّمة طلب بحث max-results
للإشارة إلى أنك تريد الحصول على 20 نتيجة في الصفحة، سيتم إنشاء أول 20 نتيجة ويتم احتساب الاستجابة الجزئية منها. إذا لم تتطابق مواصفات fields
مع أي من أول 20 إدخالًا تم تحديدها من خلال طلب البحث، سيتم إرجاع خلاصة فارغة، إلا أنّك لن تستعيد أول 20 إدخالًا مطابقًا.
ملاحظة: لا تحاول استخدام شروط الحقول كمحددات طلب البحث. وهذا يعني عدم محاولة استرداد خلاصة كاملة وتطبيق شروط الحقول لفلترة العناصر التي تهمّك من مجموعة بيانات كبيرة جدًا. استخدِم متى أمكن معلمات طلب بحث أخرى، مثل start-index
وmax-results
، لتقليل نتائج كل طلب بحث إلى حجم يمكن إدارته. وإلا فقد تفوق مكاسب الأداء المحتملة من خلال الاستجابة الجزئية هذا الانخفاض الخطير في الأداء الناتج عن الاستخدام غير اللائق.
تنسيق قيمة معلمة الحقول
توضّح الإرشادات التالية كيفية إنشاء قيمة معلَمة طلب البحث fields
. تتضمّن كل إرشادات إرشادات الأمثلة وتقدّم أوصافًا لكيفية تأثير قيمة المعلّمة في الاستجابة.
ملاحظة: كما هو الحال مع جميع قيم معامِلات طلب البحث، يجب أن تكون قيمة معلّمة fields
مشفّرة بعنوان URL. لتسهيل القراءة، تحذف الأمثلة أدناه الترميز.
- حدّد الحقول التي تريد عرضها، أو اختر اختيارات الحقول.
- قيمة معلمة طلب البحث
fields
هي قائمة مفصولة بفواصل تتضمن العناصر أو السمات (ويُطلق عليها مجتمعة اسم الحقول)، ويتم تحديد كل حقل نسبة إلى العنصر الجذر لتمثيل المورد. وبالتالي، إذا أردت استرداد خلاصة، يتم تحديد الحقول وفقًا للعنصر<feed>
، وإذا كنت تسترد إدخالاً واحدًا، يتم تحديد الحقول وفقًا للعنصر<entry>
. إذا كان العنصر الذي تحدده عنصرًا متكررًا (أو يكون جزءًا منه) في الخلاصة، ستعرض الخدمة جميع مثيلات ذلك العنصر.
في ما يلي بعض الأمثلة على مستوى الخلاصة:
أمثلة التأثير entry
لعرض جميع عناصر <entry>
وجميع العناصر الفرعية لتلك الإدخالات، ولكن ليس أي عناصر فرعية أخرى من<feed>
.id,entry
لعرض كل من الخلاصة <id>
وجميع عناصر<entry>
.entry/title
لعرض العنصر <title>
لكل إدخالات الخلاصة.
عند عرض عنصر متداخل، تتضمن الاستجابة علامات التضمين لأي عناصر رئيسية. لا تتضمّن العلامات الرئيسية أي عناصر فرعية أو سمات أخرى ما لم يتم اختيارها صراحةً أيضًا.
entry/author/uri
لعرض العنصر الفرعي <uri>
فقط من العنصر<author>
لكل إدخالات الخلاصة.entry/*:rating
لعرض العناصر الفرعية فقط التي تحمل الاسم المحلي rating
في أي مساحة اسم لجميع إدخالات الخلاصة.
في ما يلي بعض الأمثلة للمبتدئين:
أمثلة التأثير author
لعرض العنصر الفرعي <author>
من الإدخال الهدف.@gd:etag
لعرض السمة etag
من الإدخال الهدف.author/uri
لعرض العنصر الفرعي <uri>
للعنصر<author>
لإدخال الهدف.media:group/media:*
لعرض جميع الحقول الفرعية لـ <media:group>
في مساحة الاسمmedia
للإدخال الهدف. - يمكنك تقييد الاستجابة للحقول المحددة التي تطابق معايير معينة، أو استخدم شروط الحقول.
- إذا حدّد طلبك عنصرًا يحدث أكثر من مرة بشكل تلقائي، ستتضمن الاستجابة الجزئية جميع حالات هذا العنصر. ومع ذلك، يمكنك أيضًا تحديد أن الاستجابة يجب أن تتضمن فقط العناصر التي تحتوي على قيمة سمة معينة أو العناصر التي تستوفي بعض الشروط الأخرى باستخدام البنية "
[ ]
"، كما هو موضح في الأمثلة أدناه. راجع قسم بنية شرط الحقل للحصول على مزيد من التفاصيل.أمثلة التأثير entry[link/@rel='edit']
لعرض أي إدخالات في الخلاصة تحتوي على عنصر <link>
بقيمةrel
للسمة'edit'
.entry/title[text()='Today']
لعرض أي عناصر <title>
تحدث في إدخالات الخلاصة إذا كان محتواها'Today'
.entry/author[name='Jo']
لعرض أي عناصر <author>
تحدث في إدخالات الخلاصة إذا كانت تحتوي على عنصر فرعي<name>
يتضمن المحتوى'Jo'
.author[name='Jo']
لعرض العنصر <author>
في الإدخال الهدف إذا كان يحتوي على عنصر فرعي<name>
يتضمن المحتوى'Jo'
. - اطلب أجزاء من العناصر المحددة فقط أو استخدم الاختيارات الفرعية للحقول.
- إذا حدَّد طلبك عناصر معيّنة، ستعرض الخدمة العناصر بالكامل بشكل تلقائي. يمكنك تحديد أن الاستجابة يجب أن تتضمن عناصر فرعية معينة فقط داخل العناصر المحددة. ويمكنك إجراء ذلك باستخدام بنية الاختيار الفرعي "
( )
"، كما في الأمثلة أدناه.أمثلة التأثير entry/author(uri)
لعرض عنصر <uri>
الفرعي للمؤلفين في إدخالات الخلاصة فقط.entry/author[name='Jo'](uri)
لعرض عنصر <uri>
الفرعي فقط من<author>
لأي إدخالات تحمل اسم المؤلف'Jo'
.entry(link(@rel,
@href))
لا يعرض سوى قيم السمتَين rel
وhref
لكل عنصر<link>
في إدخالات الخلاصة.entry(title,link[@rel='edit'])
عرض العناصر <title>
و<link>
فقط مع تعديل سماتrel
لكل إدخال خلاصة.entry(title,author(uri)
لعرض كل من عناصر <title>
وعناصر المؤلف<uri>
لكل إدخال خلاصة.
مزيد من المعلومات عن بنية شرط الحقل
يمكنك استخدام شروط الحقول مع الحقول أو الحقول الفرعية. يجب تقييم الشرط على "صحيح" حتى يتم تضمين الحقل المحدد في النتائج.وفي حال عدم توفّر شرط للحقل، يتم تضمين جميع الحقول من النوع المحدّد.
يتم استخدام القيمة النصية للحقل المحدد لإجراء المقارنات. في هذا السياق، إذا كان الحقل عبارة عن عنصر، تكون قيمة النص هي محتوياته، وإذا كان الحقل سمة، تكون قيمة النص هي قيمة السمة. إذا كان الحقل لا يحتوي على قيمة نصية، ستفشل المقارنة ولن يتم تضمين الحقل في النتائج.
يعرض الجدول التالي عوامل تشغيل XPath المتوافقة مع شروط الحقول، كما تقدّم بعض الأمثلة.
المُشغِّل | البنية | أمثلة |
---|---|---|
مقارنة السلسلة |
|
|
المقارنة المنطقية | and |
|
المقارنة الرقمية | = أو eq != أو ne > أو gt > = أو ge < أو lt <= أو le
|
|
مقارنة التواريخ | استخدِم عوامل تشغيل المقارنة الرقمية، كما هو موضّح في الأمثلة. | لإجراء مقارنة بين التاريخ والوقت، يمكنك إرسال العناصر أو السمات أو القيم الحرفية للسلسلة إلى
|
الوجود | استخدم اسم العنصر أو السمة كما هو موضح في الأمثلة. |
|
منطقي | true() false()
|
يمكن أن تكون القيم المنطقية مفيدة أثناء الاختبار لفرض حالة الحقل على حالة "صحيح" أو "خطأ".
|
التعامل مع الردود الجزئية
بعد أن يعالج خادم يتيح الاستجابة الجزئية طلبًا صالحًا يتضمّن مَعلمة طلب البحث fields
، يرسل رمز حالة HTTP 200 OK
مرة أخرى مع السمات أو العناصر المطلوبة. إذا اشتملت معلمة طلب البحث fields
على خطأ أو كانت غير صالحة، يعرض الخادم رمز حالة HTTP 400 Bad Request
.
العنصر الجذر للاستجابة هو <feed>
أو <entry>
، استنادًا إلى معرّف الموارد المنتظم المستهدف. لا يشتمل محتوى العنصر الجذر إلا على الحقول المحددة لهذه الخلاصة أو الإدخال، بالإضافة إلى علامات التضمين لأي عناصر رئيسية.
يمكن تكرار قيمة معلمة طلب البحث للطلب fields
بطريقتين:
- يحتوي العنصر الجذر على سمة
gd:fields
تعرض قيمة معلمة طلب البحثfields
المحددة في الطلب. - إذا كان معرّف الموارد المنتظم المستهدف عبارة عن خلاصة، يتضمّن كل إدخال قابل للتعديل سمة
gd:fields
تعرض جزء التحديدfields
الذي ينطبق عليها.
ملاحظة: للاطّلاع على قيم سمات gd:fields
هذه في استجابتك الجزئية، يجب تضمينها في مواصفات مواصفات طلب البحث في fields
. ويمكنك إجراء ذلك صراحةً باستخدام @gd:fields
أو استخدام @gd:*
الأكثر عمومية، بما في ذلك معلومات ETag.
يطلب مثال طلب البحث التالي من الخادم عرض مستند يحتوي على سمات في مساحة الاسم gd
فقط (في كل من الخلاصة ومستوى الإدخال)، بالإضافة إلى معرّف الخلاصة والعنوان ورابط التعديل لكل إدخال خلاصة:
http://example.com/myFeed?fields=@gd:*,id,entry(@gd:*,title,link[@rel='edit'])
يعرض الخادم الاستجابة الجزئية التالية، بالإضافة إلى رمز حالة HTTP 200 Successful
:
<?xml version='1.0' encoding='utf-8'?> <feed xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"DEAEQH47eCp7IWA9WxBVGUo."' gd:fields='@gd:*,id,entry(@gd:*,title,link[@rel='edit'])> <id>http://example.com/myFeed</id> <entry gd:etag='"EksPTg1Bfyp7IWA6WhJT"' gd:fields="@gd:*,title,link[@rel='edit']"> <link rel='edit' href='http://example.com/myFeed/1/'/> <title>This year</title> </entry> <entry gd:etag='"EksPQA1Cdyp7IWA6WhJT"' gd:fields="@gd:*,title,link[@rel='edit']"> <link rel='edit' href='http://example.com/myFeed/2/'/> <title>Last year</title> </entry> <entry d:etag='"EksPQAxHeCp7IWA6WhJT"' gd:fields="@gd:*,title,link[@rel='edit']"> <link rel='edit' href='http://example.com/myFeed/3/'/> <title>Today</title> </entry> </feed>
في حال لم تتطابق الحقول المختارة مع أي نتيجة، ستعرض الخدمة رمز حالة HTTP 200 Successful
، ولكن الاستجابة الجزئية هي خلاصة فارغة:
<?xml version='1.0' encoding='utf-8'?> <feed xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"DEAEQH47eCp7IWA9WxBVGUo."' gd:fields='@gd:*,id,entry(@gd:*,title,link[@rel='edit'])> </feed>
تحديث جزئي (تجريبي)
تتيح لك منتجات Google التي تتوافق مع الاستجابة الجزئية والموارد القابلة للتعديل أيضًا إمكانية استخدام تحديث جزئي. من خلال التحديث الجزئي، ترسل فقط الحقول التي تريد تحديثها، بدلاً من إرسال نسخة معدّلة من تمثيل المورد بالكامل. ويتيح هذا للتطبيق العميل الحصول على مزيد من الفاعلية عند إجراء التحديثات، وكذلك عند استخدام الاستجابة الجزئية لاسترداد البيانات.
ومع ذلك، بدلاً من استخدام PUT
، عليك استخدام طلب PATCH
عند إجراء تعديل جزئي. تعتبر دلالات PATCH
قوية للغاية بما يسمح لك بإضافة حقول محددة واستبدالها وحذفها لإدخال معين، وكل ذلك بطلب واحد.
لمعرفة ما إذا كان التحديث الجزئي متوفّرًا للمنتج الذي تستخدمه، يُرجى الرجوع إلى المستندات الخاصة بالمنتج.
إرسال طلب تحديث جزئي
لإرسال طلب تعديل جزئي، يجب إرسال طلب HTTP PATCH
إلى عنوان URL نفسه الذي تستخدمه عادةً مع PUT
لتعديل المورد. نص الطلب PATCH
هو عنصر <entry>
جزئي يحدد الحقول التي تريد إضافتها أو تعديلها. تشير السمة gd:fields
للإدخال إلى الحقول التي تريد حذفها.
يعالج الخادم PATCH
من الطلبات بترتيب معين:
- ويزيل أولاً الحقول المحدّدة من خلال السمة
gd:fields
من تمثيل المورد.بنية السمة
gd:fields
هي نفس معلمة طلب البحثfields
المستخدمة عند طلب استجابة جزئية. راجع البنية المتوافقة لمزيد من التفاصيل. - وبعد ذلك، يتم دمجه في تمثيل المورد الحالي للبيانات المقدَّمة في نص الطلب.
يتوفر المزيد من التفاصيل حول كيفية دمج البيانات في إضافة الحقول أو تحديثها أدناه.
ملاحظة: نظرًا لأن نص طلب PATCH
لا يتوافق عادةً مع تنسيق مشاركة Atom، فإن Content-Type
الذي تستخدمه مع طلب PATCH
هو application/xml
.
في ما يلي مثال على طلب تعديل جزئي:
PATCH /myFeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:fields='description'> <title>New title</title> </entry>
يؤدي طلب PATCH
هذا إلى إجراء التغييرات التالية على تمثيل المورد المخزن على الخادم لإدخال URI الهدف:
- لإزالة العنصر
<description>
. - تحديث العنصر
<title>
.
دلالات طلب التحديث الجزئي
توضّح التعليمات أدناه كيفية إعداد طلب PATCH
لحذف حقول محدّدة أو إضافتها أو تعديلها داخل إدخال. يمكن أن يؤدي طلب PATCH
واحد إلى إجراء أي مجموعة من هذه العمليات.
حذف الحقول. استخدِم السمة
gd:fields
للعنصر<entry>
لتحديد أي حقول تريد حذفها من المورد. يؤدي نموذج الطلب التالي إلى حذف العنوان والملخص المرتبطين بأحد الإدخالات. ومع ذلك، لا يضيف الطلب أو يُحدِّث أي بيانات أخرى لهذا الإدخال.PATCH /myfeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:fields='title,summary'/>
إضافة الحقول أو تحديثها. يمكنك استخدام نص العنصر
<entry>
لتحديد البيانات التي تريد إضافتها أو تعديلها لمورد معيّن. يتم دمج هذه الحقول في البيانات الحالية للمورد، بعد إجراء أي عمليات حذف، وفقًا للقواعد التالية:تتم إضافة الحقول غير الموجودة مسبقًا. وإذا لم تحدِّد بيانات المورد قيمة لحقل من قبل، ستتم إضافة الحقل إلى البيانات الحالية. على سبيل المثال، إذا كان الإدخال لا يحتوي على عنوان، ويحتوي الطلب
PATCH
على عنصر<title>
، تتم إضافة العنوان الجديد إلى الإدخال.يتم استبدال الحقول الموجودة بالفعل أو إلحاقها. يعتمد السلوك المحدّد لدمج الحقول المحدَّد من قبل في بيانات المورد على خصائص الحقل:
يتم استبدال الحقول غير المتكررة. إذا سبق أن حدّدت بيانات المورد قيمة لعنصر غير متكرر، ستحل القيمة التي تحدّدها في طلب
PATCH
محل القيمة الحالية لهذا العنصر. في المثال التالي، يحل العنوان الجديد محل العنوان الحالي.PATCH /myFeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'> <title>New Title</title> </entry>
في ما يلي مثال أكثر تعقيدًا. في هذا المثال، نفترض أن الإدخال يمكن أن يحتوي على مؤلف واحد فقط، وأن المورد الهدف يحتوي بالفعل على قيم لاسم المؤلف وعنوان بريده الإلكتروني. على الرغم من أنّ عنصر
<author>
يحتوي على حقلَين فرعيَين، يتوفّر العنصر<name>
فقط في البيانات المقدَّمة. نتيجةً لذلك، يتم استبدال قيمة هذا الحقل فقط. تظل قيمة العنصر<email>
، التي تنقصها البيانات المقدَّمة، بدون تغيير.PATCH /myfeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'> <author> <name>New Name</name> </author> </entry>
يتم إلحاق الحقول المكررة. إذا كانت بيانات المورد تحدد قيمة لعنصر متكرر، فستتم إضافة العنصر الجديد الذي تقدمه إلى مجموعة القيم الحالية.
تجدر الإشارة إلى أنه قد تكون هناك أوقات تريد فيها إجراء شيء آخر غير إضافة مثيل جديد لعنصر متكرر. على سبيل المثال، يمكنك تنفيذ أحد الإجراءات التالية:
استبدال قائمة كاملة بالعناصر المتكررة. يمكنك حذف جميع الحقول المتكرّرة باستخدام السمة
gd:fields
(على سبيل المثال،gd:fields='ns:accessControl'
) وتقديم مجموعة كاملة من الحقول البديلة. نظرًا لأنه يتم حذف جميع العناصر الحالية أولاً، فإن مجموعة الحقول التي تقدمها لا تتعارض مع أي قيم حالية عند إلحاقها.استبدال قيمة واحدة في مجموعة من القيم الحالية لعنصر متكرر. في هذه الحالة، يمكنك ببساطة إزالة العنصر الواحد من خلال تحديد القيمة
gd:fields
بشكلٍ كافٍ لتجنب حذف القيم الأخرى التي تريد الاحتفاظ بها. على سبيل المثال، لإزالة التحكم في الوصول فقط باستخدامaction
منembed
، يمكنك استخدامgd:fields='ns:accessControl[@action="embed"]'
. بعد ذلك، يجب تقديم الحقل المنفرد الذي تريد استبداله به في نص العنصر<entry>
:PATCH /myfeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:fields='ns:accessControl[@action="embed"]> <ns:accessControl action="embed" permission="allowed" /> </entry>
معالجة الاستجابة لتحديث جزئي
بعد معالجة طلب تحديث جزئي صالح، تعرض واجهة برمجة التطبيقات رمز استجابة HTTP 200 OK
. بشكل افتراضي، يكون نص الاستجابة هو الإدخال الكامل الذي عدَّلته. يعدّل الخادم قيم ETag عندما يعالج طلب PATCH
بنجاح، تمامًا كما يحدث مع PUT
.
إذا نتج عن طلب PATCH
حالة مورد جديدة غير صالحة من حيث البنية أو الدلالة، يعرض الخادم رمز حالة HTTP HTTP 400 Bad Request
أو 422 Unprocessable Entity
، وتظل حالة المورد بدون تغيير. على سبيل المثال، إذا حاولت حذف حقل مطلوب بدون تقديم بديل، سيعرض الخادم خطأً.
ملاحظة: من المهم فهم كيفية ارتباط الحقول المختلفة ببعضها البعض. قد يكون من الممكن وضع المورد في حالة متناقضة عن طريق تحديث جزء فقط من القيم المترابطة. على سبيل المثال، قد يكون من الممكن تعديل وقت البدء إلى قيمة لاحقة بدلاً من وقت الانتهاء. على الرغم من أن واجهة برمجة التطبيقات يجب أن تعرض رمز خطأ، نوصيك باختبار هذه الأنواع من الشروط بشكل كامل لضمان الاتساق.
تدوين بديل عندما لا يكون PATCH معتمدًا
إذا كان الجدار الناري لا يسمح بـ PATCH
، فعليك إذًا تنفيذ طلب HTTP POST
واضبط عنوان التجاوز على PATCH
، كما هو موضّح أدناه:
POST /myfeed/1/1/ X-HTTP-Method-Override: PATCH Content-Type: application/xml ...
استخدام رد جزئي مع تحديث جزئي
يمكنك استخدام رد جزئي كجزء من طلب تحديث جزئي لاحق. في هذه الحالة، حدّد معلمة طلب البحث fields
التي تتضمن روابط التعديل، بالإضافة إلى @gd:*
. ويضمن ذلك أنّ الاستجابة الجزئية تتضمّن معلومات، مثل قيم السمتَين ETag وgd:fields
، وهي مهمة للطلبات اللاحقة.
في ما يلي مثال يعرض ردًا جزئيًا يمكنك استخدامه كأساس لتحديث جزئي في المستقبل:
http://example.com/myFeed/1/1/?fields=@gd:*,link[@rel='edit'](@href),gd:who
يستجيب الخادم:
<?xml version='1.0' encoding='utf-8'?> <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='"E0UKRAREeCp7IWA6WhJT"' gd:fields="@gd;*,link[@rel='edit'](@href),gd:who"> <link href='http://example.com/myFeed/1/1/'/> <gd:who email='liz@gmail.com'/> <gd:who email='jo@gmail.com'/> <gd:who email='jane@gmail.com'/> </entry>
لنفترض أنك تريد إزالة المستخدم الذي يمتلك البريد الإلكتروني 'jane@gmail.com'
، وإضافة مستخدم له البريد الإلكتروني 'will@gmail.com'
، وتغيير البريد الإلكتروني للمستخدم المدرج حاليًا كـ 'jo@gmail.com'
إلى 'josy@gmail.com'
.
يمكنك إجراء هذه التغييرات ببساطة عن طريق البدء بنتائج الرد السابق، وتعديل الحقول المختلفة فقط، وإرسال الإدخال الجزئي المعدّل كنص أساسي لطلب PATCH
. في هذا المثال، التعديلات المطلوبة هي:
- احذف
<gd:who email='jane'/>
من قائمة العناصر المتوفرة. - إضافة
<gd:who email='will@gmail.com'/>
إلى قائمة العناصر المتوفرة. - استبدال
<gd:who email='jo@gmail.com'/>
بـ<gd:who email='josy@gmail.com'/>
.
يظهر أدناه طلب PATCH
استنادًا إلى رد جزئي جزئي:
PATCH /myFeed/1/1/ Content-Type: application/xml <entry gd:fields="@gd:*,link[@rel='edit'](@href),gd:who" gd:etag="FE8LQQJJeSp7IWA6WhVa"> <link href='http://example.com/myFeed/1/1'/> <gd:who email='liz@gmail.com'/> <gd:who email='josy@gmail.com'/> <gd:who email='will@gmail.com'/> </entry>
ملاحظة: يعتمد هذا النهج على تضمين السمتين gd:fields
وgd:etag
(إذا كانا متاحين) في الاستجابة الجزئية للإدخال. يجب أن يحتوي نص الإدخال الجزئي على جميع الحقول والسمات التي كانت موجودة في الاستجابة الجزئية، باستثناء تلك التي تريد إزالتها صراحةً. يمكنك تعديل أي من الحقول الحالية في النص الأساسي باستخدام قيم جديدة، ويمكنك تضمين أي حقول جديدة تريد إضافتها.
المصادقة
عندما يحاول عميل الوصول إلى خدمة، قد يحتاج إلى تقديم بيانات اعتماد المستخدم إلى الخدمة، لتوضيح أن المستخدم لديه الصلاحية لتنفيذ الإجراء المعني.
يعتمد الأسلوب الذي يجب أن يستخدمه العميل للمصادقة على نوع البرنامج:
- يجب أن يستخدم تطبيق سطح المكتب نظام مصادقة خاصًا بـ Google يسمى مصادقة الحساب للتطبيقات المثبتة (المعروف أيضًا باسم "ClientLogin"). (يجب ألا يستخدم العملاء الذين يستخدمون الويب هذا النظام).
- على العميل المستند إلى الويب، مثل الواجهة الأمامية لخدمة من خدمات Google، استخدام نظام مصادقة خاص بـ Google يُسمى وكيل مصادقة الحساب للتطبيقات المستندة إلى الويب (المعروف أيضًا باسم "AuthSub").
في نظام ClientLogin، يطلب عميل سطح المكتب من المستخدم بيانات اعتماده، ثم يرسل بيانات الاعتماد هذه إلى نظام مصادقة Google.
إذا نجحت المصادقة، يعرض نظام المصادقة رمزًا مميزًا يستخدمه العميل لاحقًا (في عنوان مصادقة HTTP) عندما يرسل طلبات بيانات من واجهة برمجة التطبيقات.
في حال تعذُّر المصادقة، يعرض الخادم رمز الحالة "403 محظور"، بالإضافة إلى رأس مصادقة WWW الذي يحتوي على اختبار التحقُّق المُطبَّق على عملية المصادقة.
ويعمل نظام AuthSub بالطريقة نفسها، إلا أنه يربط المستخدم بخدمة Google التي تطلب بيانات الاعتماد، بدلاً من طلب بيانات الاعتماد من المستخدم. بعد ذلك تعرض الخدمة رمزًا مميزًا يمكن لتطبيق الويب استخدامه، وتتمثل فائدة هذا الأسلوب في أن Google (وليس الواجهة الأمامية للويب) تعالج بيانات اعتماد المستخدم وتخزنها بشكل آمن.
للحصول على تفاصيل حول أنظمة المصادقة هذه، اطلع على وثائق نظرة عامة على مصادقة واجهات برمجة تطبيقات بيانات Google أو وثائق مصادقة حساب Google.
حالة الجلسة
تتطلب العديد من عمليات تنفيذ منطق النشاط التجاري معدل مدة الجلسة - تتبع حالة جلسة المستخدم.
يتتبع Google حالة الجلسة بطريقتين: استخدام ملفات تعريف الارتباط، واستخدام رمز مميز يمكن إرساله كمعلمة طلب بحث. تحقّق كلتا الطريقتين التأثير نفسه. نوصي بأن يدعم العملاء إحدى طرق تتبع حالة الجلسة هذه (التي تكفي واحدة منها). إذا كان العميل لا يدعم أيًا من هاتين الطريقتين، فسيستمر هذا العميل في العمل مع واجهات برمجة التطبيقات للبيانات، ولكن قد يؤثر الأداء مقارنةً بالعملاء الذين يعتمدون هذه الطرق. على وجه التحديد، إذا كان البرنامج لا يتيح هذه الطرق، يؤدي كل طلب إلى إعادة توجيه، وبالتالي يتم إرسال كل طلب (وأي بيانات مرتبطة به) إلى الخادم مرتين، ما يؤثر في أداء كل من البرنامج والخادم.
تتعامل مكتبات برامج Google مع حالة الجلسة نيابةً عنك، لذلك إذا كنت تستخدم مكتباتنا، لن تحتاج إلى اتخاذ أي إجراء للحصول على دعم حالة الجلسة.
مراجع إضافية
قد تجد مستندات الجهات الخارجية التالية مفيدة:
- مقارنة بين Atom وRSS
- نظرة عامة على Atom من IBM
- إضافات Dublin Core إلى RSS
- تعريفات الطريقة HTTP 1.1؛ مواصفات
GET
وPOST
وPUT
وDELETE
- تعريفات رمز الحالة لبروتوكول HTTP 1.1
- كيفية إنشاء بروتوكول REST
- تصميم خدمات الويب بطريقة REST
- مقدمة فنية عن XML
- مساحات أسماء XML حسب المثال
- قسم ETag بمواصفات HTTP