مرجع البروتوكول

تحذير: تتعلق هذه الصفحة بواجهات برمجة التطبيقات القديمة من 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
مؤلف الخلاصة

/feed/author/name
/feed/author/email

(مطلوب في حالات معينة، راجع مواصفات 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
ملخّص الاشتراك

/feed/entry/summary

(مطلوب في حالات معينة، راجع مواصفات Atom.)

محتوى المشاركة

/feed/entry/content

(في حال عدم توفّر عنصر محتوى، يجب أن يحتوي الإدخال على عنصر <link rel="alternate"> واحد على الأقل.)

مؤلف المشاركة

/feed/entry/author/name
/feed/entry/author/email

(مطلوب في حالات معينة، راجع مواصفات 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 نوع التمثيل البديل
  • في حال عدم تحديد معلمة alt، ستعرض الخدمة خلاصة Atom. يعادل ذلك alt=atom.
  • تعرض alt=rss خلاصة نتائج RSS 2.0 (للقراءات فقط). عندما تطلب بيانات من خدمة بتنسيق RSS، تقدم الخدمة خلاصة (أو تمثيلاً آخر للمورد) بتنسيق RSS. إذا لم تكن هناك خاصية RSS مكافئة لخاصية Data API معينة، فإن الخدمة تستخدم خاصية Atom، وتصنفها باستخدام مساحة اسم مناسبة للإشارة إلى أنها امتداد لـ RSS.
  • تعرض alt=json تمثيل JSON للخلاصة. مزيد من المعلومات
  • يطلب alt=json-in-script استجابة تُلفِّي JSON في علامة نص برمجي. مزيد من المعلومات
  • يطلب alt=atom-in-script استجابة Atom تغطي سلسلة XML في علامة نص برمجي.
  • يطلب alt=rss-in-script استجابة RSS التي تُلف سلسلة XML في علامة نص برمجي.
  • alt=atom-service يطلب مستند خدمة Atom يصف الخلاصة.
author مؤلف المشاركة
  • تعرض الخدمة إدخالات يكون فيها اسم المؤلف و/أو عنوان البريد الإلكتروني متطابقًا مع سلسلة طلب البحث.
category فلتر طلبات بحث الفئات
  • طريقة بديلة لتنفيذ فلتر الفئات. هناك طريقتان متكافئتان.
  • لإجراء OR بين العبارات، استخدِم رمز الشرطة الرأسية (|)، مع ترميز عنوان URL بالصيغة %7C. على سبيل المثال: تعرض الدالة http://www.example.com/feeds?category=Fritz%7CLaurie إدخالات تُطابق أي فئة.
  • لإجراء AND بين عبارتي البحث، استخدِم حرف الفاصلة (,). على سبيل المثال: تعرض الدالة http://www.example.com/feeds?category=Fritz,Laurie إدخالات تتطابق مع كلتا الفئتين.
/-/category فلتر طلبات بحث الفئات
  • أدرج كل فئة كما لو كانت جزءًا من معرّف الموارد المنتظم (URI) للمورد، في النموذج /categoryname/. ويعتبر هذا استثناءً لنموذج name=value العادي.
  • أدرج جميع الفئات قبل أي معلمات طلب بحث أخرى.
  • وضَع الفئة الأولى مع /-/ لتوضيح أنها فئة. على سبيل المثال، إذا كانت خلاصة جو تتضمن فئة من الإدخالات حول Fritz، يمكنك طلب هذه الإدخالات مثل: http://www.example.com/feeds/jo/-/Fritz. ويتيح هذا التنفيذ تمييز معرّفات الموارد المنتظمة (URI) لطلبات البحث المستندة إلى الفئة عن معرّفات الموارد المنتظمة (URI) للموارد.
  • يمكنك إجراء طلب بحث في فئات متعددة من خلال إدراج معلمات الفئات المتعددة، مفصولة بفواصل. تعرض الخدمة جميع الإدخالات التي تتطابق مع جميع الفئات (مثل استخدام AND بين العبارات). على سبيل المثال: تعرض الدالة http://www.example.com/feeds/jo/-/Fritz/Laurie إدخالات تتطابق مع كلتا الفئتين.
  • لإجراء OR بين العبارات، استخدِم رمز الشرطة الرأسية (|)، مع ترميز عنوان URL بالصيغة %7C. على سبيل المثال: تعرض الدالة http://www.example.com/feeds/jo/-/Fritz%7CLaurie إدخالات تُطابق أي فئة.
  • يتطابق إدخال مع فئة محددة إذا كان الإدخال في فئة تحتوي على عبارة أو تصنيف مطابق، كما هو محدد في مواصفات Atom. (تقريبًا، "العبارة" هي السلسلة الداخلية التي يستخدمها البرنامج لتحديد الفئة، في حين تكون "التصنيف" هي السلسلة التي يمكن للإنسان قراءتها للمستخدمين في واجهة المستخدم.)
  • لاستبعاد الإدخالات التي تطابق فئة معيّنة، استخدِم النموذج /-categoryname/.
  • لطلب البحث عن فئة تحتوي على مخطط - مثل <category scheme="urn:google.com" term="public"/> - يجب وضع المخطط بين أقواس معقوفة قبل اسم الفئة. على سبيل المثال: /{urn:google.com}public إذا كان النظام يحتوي على رمز شرطة مائلة (/)، فيجب أن يكون بترميز URL مثل %2F. لمطابقة فئة لا تحتوي على مخطط، استخدم زوجًا فارغًا من الأقواس المعقوفة. إذا لم تحدد أقواسًا معقوفة، فستتطابق الفئات في أي مخطط.
  • يمكن دمج الميزات أعلاه. على سبيل المثال: /A%7C-{urn:google.com}B/-C تعني (A OR (NOT B)) AND (NOT C).
entryID رقم تعريف إدخال محدّد لاسترداده
  • وإذا حددت رقمًا تعريفيًا للإدخال، فلن يمكنك تحديد أية معلمات أخرى.
  • تحدِّد الخدمة شكل رقم تعريف الإدخال.
  • وعلى عكس معظم معلمات طلب البحث الأخرى، يتم تحديد معرّف الإدخال كجزء من معرّف الموارد المنتظم (URI)، وليس كزوج من الاسم=القيمة.
  • مثال: http://www.example.com/feeds/jo/entry1
fields فلتر الردود
  • لا يعرض سوى الحقول المطلوبة بدلاً من عرض تمثيل المورد الكامل. على سبيل المثال:
    http://www.example.com/feeds?fields=link,entry(@gd:etag,id,updated,link[@rel='edit']))
    عندما يتلقّى الخادم هذا الطلب، يعرض استجابة تتضمّن فقط عناصر الرابط والإدخال في الخلاصة. بالإضافة إلى ذلك، تكون عناصر الإدخال المعروضة عبارة عن إدخالات جزئية لا تحتوي إلا على روابط ETag والمعرّف و"تعديل" و"تعديل الروابط".
  • يجب أن تكون قيمة الحقول بترميز عنوان URL، كما هو الحال مع جميع قيم معلمات طلب البحث.
  • لمزيد من المعلومات، راجع قسم الاستجابة الجزئية.
  • هذه المعلمة هي ميزة تجريبية في الوقت الحالي.
max-results الحد الأقصى لعدد النتائج المراد استردادها بالنسبة إلى أي خدمة تحتوي على قيمة max-results تلقائية (لتقييد حجم الخلاصة التلقائية)، يمكنك تحديد عدد كبير جدًا إذا أردت تلقّي الخلاصة بأكملها.
prettyprint لعرض استجابة XML تتضمّن هويات وفواصل أسطر
  • إذا prettyprint=true، فسيكون XML الذي يعرضه الخادم قابلاً للقراءة (مطبوع إلى حد كبير).
  • عناوين URL التلقائية: prettyprint=false
published-min، published-max القيود المفروضة على تاريخ نشر الإدخال
  • استخدِم تنسيق الطابع الزمني RFC 3339. على سبيل المثال: 2005-08-09T10:57:00-08:00
  • ويكون الحد الأدنى مشمولاً، في حين يكون الحد الأعلى حصريًا.
q سلسلة طلب بحث عن النص الكامل
  • عند إنشاء طلب بحث، أدرج عبارات البحث مفصولة بمسافات، على هيئة q=term1 term2 term3. (وكما هو الحال مع جميع قيم معامِلات طلب البحث، يجب أن تكون المسافات بترميز عنوان URL). تعرض الخدمة جميع الإدخالات التي تتطابق مع جميع عبارات البحث (مثل استخدام AND بين العبارات). ومثل بحث الويب من Google، تبحث إحدى الخدمات عن الكلمات الكاملة (والكلمات ذات الصلة بنفس الجذر)، وليس السلاسل الفرعية.
  • للبحث عن عبارة مطابقة، عليك وضع العبارة بين علامتي اقتباس: q="exact phrase".
  • لاستبعاد الإدخالات التي تطابق عبارة معينة، استخدم النموذج q=-term.
  • عملية البحث غير حساسة لحالة الأحرف.
  • مثال: للبحث عن جميع الإدخالات التي تحتوي على العبارة "إليزابيث بينيت" بالضبط والكلمة "دارسي" ولكن لا تحتوي على الكلمة "أوستن"، استخدم طلب البحث التالي: ?q="Elizabeth Bennet" Darcy -Austen
start-index فهرس يستند إلى 1 للنتيجة الأولى المطلوب استردادها
  • لاحظ أن هذه ليست آلية إشارات عامة. إذا تم إرسال طلب بحث باستخدام ?start-index=1&max-results=10 أولاً، ثم تم إرسال طلب بحث آخر باستخدام ?start-index=11&max-results=10، لا يمكن أن تضمن الخدمة تساوي نتيجتَي البحث ?start-index=1&max-results=20 لأنه تم إجراء عمليات إدراج وحذف على طلبَي البحث.
strict تحقق صارم من معلمة طلب البحث
  • يمكنك ضبط strict=true للتحقّق من أن الخدمة تتعرّف على كل معلّمة من معلمات طلب البحث. سيتم عرض خطأ إذا لم يتم التعرف على المعلمة.
  • عناوين URL التلقائية: strict=false
updated-min، updated-max القيود المفروضة على تاريخ تحديث الإدخال
  • استخدِم تنسيق الطابع الزمني RFC 3339. على سبيل المثال: 2005-08-09T10:57:00-08:00
  • ويكون الحد الأدنى مشمولاً، في حين يكون الحد الأعلى حصريًا.
  • في بعض الحالات (مثل استخدام الإصدار 2.1 أو إصدار أحدث من واجهة برمجة تطبيقات بيانات التقويم)، سيؤدي تحديد updated-min الذي يقع في فترة بعيدة جدًا في الماضي إلى عرض حالة HTTP 410 (تمت إزالة الصفحة).

حول طلبات البحث عن الفئة

قررنا توفير تنسيق غير مألوف إلى حد ما لطلبات بحث الفئة. بدلاً من طلب طلب بحث مثل ما يلي:

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 المتوافقة مع شروط الحقول، كما تقدّم بعض الأمثلة.

المُشغِّل البنية أمثلة
مقارنة السلسلة

= أو eq
!= أو ne

  • لعرض الإدخال بالكامل إذا كان يحتوي على عنصر <link> مع تعيين السمة rel على 'self':
        entry[link/@rel='self']

  • لعرض الإدخال بالكامل إذا كان يحتوي على عنصر <title> مع محتوى يساوي السلسلة 'unknown':
        entry[title eq 'unknown']

  • لعرض عنصر <title> بأكمله إذا لم يكن محتواه 'unknown':
        title[text() != 'unknown']
المقارنة المنطقية and
or
not
  • لعرض أي رابط يحتوي على سمة rel المضبوطة على 'self' أو 'edit':
        link[@rel='self' or @rel='edit']

  • لعرض أي رابط يحتوي على سمة rel المضبوطة على 'self' والسمة type التي تم ضبطها على 'application/atom+xml':
        link[@rel='self' and @type='application/atom+xml']

  • لعرض أي رابط لا يحتوي على سمة rel بالقيمة 'self':
        link[not(@rel='self')]

    لاحظ أنه، كما في XPath، يبدو not كاستدعاء دالة.
المقارنة الرقمية = أو eq
!= أو ne
> أو gt
>= أو ge
< أو lt
<= أو le
  • لعرض أي عنصر <gd:rating> يتضمن السمة value التي يمكن تحويلها إلى العدد الصحيح 5:
        gd:rating[@value=5]

  • لعرض أي عنصر <gd:rating> يتضمن السمة average والذي يمكن تحويله إلى قيمة عائمة أكبر من 4.3:
        gd:rating[@average gt 4.3]
مقارنة التواريخ استخدِم عوامل تشغيل المقارنة الرقمية، كما هو موضّح في الأمثلة.

لإجراء مقارنة بين التاريخ والوقت، يمكنك إرسال العناصر أو السمات أو القيم الحرفية للسلسلة إلى xs:date أو xs:dateTime. بالنسبة إلى xs:dateTime، تكون المنطقة الزمنية التلقائية هي التوقيت العالمي المتّفق عليه، ولكن من الأفضل تحديد منطقة زمنية بشكلٍ صريح.

  • لعرض أي عنصر <yt:recorded> يحتوي على تاريخ منذ 1 كانون الثاني (يناير) 2005:
        yt:recorded[xs:date(text())>=xs:date('2005-01-01')]

  • لعرض أي إدخالات تم تعديلها بعد الوقت المحدد، وفقًا للمنطقة الزمنية حسب التوقيت العالمي المُنسّق:
        entry[xs:dateTime(updated)>xs:dateTime('2008-07-25T08:19:37.549Z')]
الوجود

استخدم اسم العنصر أو السمة كما هو موضح في الأمثلة.

  • لعرض أي إدخالات تحتوي على رابط يتضمّن السمة rel:
        entry[link/@rel]

  • لعرض أي عناصر <gd:rating> تحتوي على سمة يُطلق عليها value:
        entry/gd:rating[@value]
منطقي true()
false()

يمكن أن تكون القيم المنطقية مفيدة أثناء الاختبار لفرض حالة الحقل على حالة "صحيح" أو "خطأ".

  • لعرض أي عناصر <link>:
        link[true()]

التعامل مع الردود الجزئية

بعد أن يعالج خادم يتيح الاستجابة الجزئية طلبًا صالحًا يتضمّن مَعلمة طلب البحث 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 من الطلبات بترتيب معين:

  1. ويزيل أولاً الحقول المحدّدة من خلال السمة gd:fields من تمثيل المورد.

    بنية السمة gd:fields هي نفس معلمة طلب البحث fields المستخدمة عند طلب استجابة جزئية. راجع البنية المتوافقة لمزيد من التفاصيل.

  2. وبعد ذلك، يتم دمجه في تمثيل المورد الحالي للبيانات المقدَّمة في نص الطلب.

    يتوفر المزيد من التفاصيل حول كيفية دمج البيانات في إضافة الحقول أو تحديثها أدناه.

ملاحظة: نظرًا لأن نص طلب 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 (إذا كانا متاحين) في الاستجابة الجزئية للإدخال. يجب أن يحتوي نص الإدخال الجزئي على جميع الحقول والسمات التي كانت موجودة في الاستجابة الجزئية، باستثناء تلك التي تريد إزالتها صراحةً. يمكنك تعديل أي من الحقول الحالية في النص الأساسي باستخدام قيم جديدة، ويمكنك تضمين أي حقول جديدة تريد إضافتها.

المصادقة

عندما يحاول عميل الوصول إلى خدمة، قد يحتاج إلى تقديم بيانات اعتماد المستخدم إلى الخدمة، لتوضيح أن المستخدم لديه الصلاحية لتنفيذ الإجراء المعني.

يعتمد الأسلوب الذي يجب أن يستخدمه العميل للمصادقة على نوع البرنامج:

في نظام ClientLogin، يطلب عميل سطح المكتب من المستخدم بيانات اعتماده، ثم يرسل بيانات الاعتماد هذه إلى نظام مصادقة Google.

إذا نجحت المصادقة، يعرض نظام المصادقة رمزًا مميزًا يستخدمه العميل لاحقًا (في عنوان مصادقة HTTP) عندما يرسل طلبات بيانات من واجهة برمجة التطبيقات.

في حال تعذُّر المصادقة، يعرض الخادم رمز الحالة "403 محظور"، بالإضافة إلى رأس مصادقة WWW الذي يحتوي على اختبار التحقُّق المُطبَّق على عملية المصادقة.

ويعمل نظام AuthSub بالطريقة نفسها، إلا أنه يربط المستخدم بخدمة Google التي تطلب بيانات الاعتماد، بدلاً من طلب بيانات الاعتماد من المستخدم. بعد ذلك تعرض الخدمة رمزًا مميزًا يمكن لتطبيق الويب استخدامه، وتتمثل فائدة هذا الأسلوب في أن Google (وليس الواجهة الأمامية للويب) تعالج بيانات اعتماد المستخدم وتخزنها بشكل آمن.

للحصول على تفاصيل حول أنظمة المصادقة هذه، اطلع على وثائق نظرة عامة على مصادقة واجهات برمجة تطبيقات بيانات Google أو وثائق مصادقة حساب Google.

حالة الجلسة

تتطلب العديد من عمليات تنفيذ منطق النشاط التجاري معدل مدة الجلسة - تتبع حالة جلسة المستخدم.

يتتبع Google حالة الجلسة بطريقتين: استخدام ملفات تعريف الارتباط، واستخدام رمز مميز يمكن إرساله كمعلمة طلب بحث. تحقّق كلتا الطريقتين التأثير نفسه. نوصي بأن يدعم العملاء إحدى طرق تتبع حالة الجلسة هذه (التي تكفي واحدة منها). إذا كان العميل لا يدعم أيًا من هاتين الطريقتين، فسيستمر هذا العميل في العمل مع واجهات برمجة التطبيقات للبيانات، ولكن قد يؤثر الأداء مقارنةً بالعملاء الذين يعتمدون هذه الطرق. على وجه التحديد، إذا كان البرنامج لا يتيح هذه الطرق، يؤدي كل طلب إلى إعادة توجيه، وبالتالي يتم إرسال كل طلب (وأي بيانات مرتبطة به) إلى الخادم مرتين، ما يؤثر في أداء كل من البرنامج والخادم.

تتعامل مكتبات برامج Google مع حالة الجلسة نيابةً عنك، لذلك إذا كنت تستخدم مكتباتنا، لن تحتاج إلى اتخاذ أي إجراء للحصول على دعم حالة الجلسة.

مراجع إضافية

قد تجد مستندات الجهات الخارجية التالية مفيدة:

الرجوع إلى الأعلى