يتناول هذا المستند بعض الأساليب التي يمكنك استخدامها لتحسين أداء تطبيقك. في بعض الحالات، يتم استخدام أمثلة من واجهات برمجة تطبيقات أخرى أو واجهات برمجة تطبيقات عامة لتوضيح الأفكار المقدَّمة. ومع ذلك، تنطبق المفاهيم نفسها على Gmail API.
الضغط باستخدام gzip
من الطرق السهلة والمريحة لتقليل معدّل نقل البيانات المطلوب لكل طلب تفعيل ضغط gzip. على الرغم من أنّ ذلك يتطلّب وقتًا إضافيًا لوحدة المعالجة المركزية من أجل فك ضغط النتائج، إلا أنّ الموازنة مع تكاليف الشبكة تجعل ذلك يستحق العناء عادةً.
لتلقّي استجابة بترميز gzip، عليك إجراء ما يلي: ضبط عنوان Accept-Encoding
وتعديل وكيل المستخدم ليحتوي على السلسلة gzip
. في ما يلي مثال على عناوين HTTP منسَّقة بشكل صحيح لتفعيل ضغط gzip:
Accept-Encoding: gzip User-Agent: my program (gzip)
التعامل مع الموارد الجزئية
هناك طريقة أخرى لتحسين أداء طلبات البيانات من واجهة برمجة التطبيقات، وهي إرسال واستلام الجزء من البيانات الذي يهمّك فقط. يتيح ذلك لتطبيقك تجنُّب نقل الحقول غير الضرورية وتحليلها وتخزينها، ما يتيح له استخدام الموارد، بما في ذلك الشبكة ووحدة المعالجة المركزية والذاكرة، بشكل أكثر فعالية.
هناك نوعان من الطلبات الجزئية:
- الاستجابة الجزئية: طلب تحدّد فيه الحقول التي تريد تضمينها في الاستجابة (استخدِم مَعلمة الطلب
fields
). - التعديل: طلب تعديل ترسل فيه الحقول التي تريد تغييرها فقط (استخدِم فعل HTTP
PATCH
).
تتوفر المزيد من التفاصيل حول تقديم طلبات جزئية في الأقسام التالية.
ردّ جزئي
بشكلٍ تلقائي، يعيد الخادم إرسال التمثيل الكامل لمورد بعد معالجة الطلبات. للحصول على أداء أفضل، يمكنك أن تطلب من الخادم إرسال الحقول التي تحتاج إليها فقط والحصول على ردّ جزئي بدلاً من ذلك.
لطلب استجابة جزئية، استخدِم مَعلمة الطلب fields
لتحديد الحقول التي تريد عرضها. يمكنك استخدام هذه المَعلمة مع أي طلب يعرض بيانات الرد.
يُرجى العِلم أنّ المَعلمة fields
تؤثّر فقط في بيانات الاستجابة، ولا تؤثّر في البيانات التي عليك إرسالها، إن وُجدت. لتقليل مقدار البيانات التي ترسلها عند تعديل الموارد، استخدِم طلب تصحيح.
مثال
يوضّح المثال التالي استخدام المَعلمة fields
مع واجهة برمجة تطبيقات عامة (وهمية) باسم "العرض التوضيحي".
طلب بسيط: لا يتضمّن طلب HTTP GET
هذا المَعلمة fields
ويعرض المورد الكامل.
https://www.googleapis.com/demo/v1
استجابة المورد الكاملة: تتضمّن بيانات المورد الكاملة الحقول التالية، بالإضافة إلى العديد من الحقول الأخرى التي تم حذفها للاختصار.
{ "kind": "demo", ... "items": [ { "title": "First title", "comment": "First comment.", "characteristics": { "length": "short", "accuracy": "high", "followers": ["Jo", "Will"], }, "status": "active", ... }, { "title": "Second title", "comment": "Second comment.", "characteristics": { "length": "long", "accuracy": "medium" "followers": [ ], }, "status": "pending", ... }, ... ] }
طلب الحصول على استجابة جزئية: يستخدم الطلب التالي للحصول على المورد نفسه المَعلمة fields
لتقليل كمية البيانات التي يتم إرجاعها بشكل كبير.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
الرد الجزئي: ردًا على الطلب أعلاه، يرسل الخادم ردًا يحتوي فقط على معلومات النوع بالإضافة إلى مصفوفة عناصر مختصرة تتضمّن فقط معلومات عنوان HTML وطول السمة في كل عنصر.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
يُرجى العِلم أنّ الردّ هو عنصر JSON يتضمّن الحقول المحدّدة فقط وعناصرها الرئيسية المضمّنة.
في ما يلي، سنقدّم تفاصيل حول كيفية تنسيق المَعلمة fields
، ثمّ سنقدّم المزيد من التفاصيل حول ما يتم عرضه بالضبط في الردّ.
ملخّص لتركيبة مَعلمة الحقول
يستند تنسيق قيمة مَعلمة طلب fields
بشكل غير دقيق إلى بنية XPath. يرد أدناه ملخّص للبنية المتوافقة، كما يتم تقديم أمثلة إضافية في القسم التالي.
- استخدِم قائمة مفصولة بفواصل لاختيار حقول متعددة.
- استخدِم
a/b
لاختيار حقلb
متداخل ضمن الحقلa
، واستخدِمa/b/c
لاختيار حقلc
متداخل ضمنb
.
استثناء: بالنسبة إلى ردود واجهة برمجة التطبيقات التي تستخدم أغلفة "البيانات"، حيث يكون الرد متداخلاً ضمن عنصر
data
يشبهdata: { ... }
، لا تضمِّن "data
" في مواصفاتfields
. سيؤدي تضمين عنصر البيانات مع مواصفات الحقول مثلdata/a/b
إلى حدوث خطأ. بدلاً من ذلك، استخدِم مواصفةfields
مثلa/b
. - استخدِم أداة اختيار فرعية لطلب مجموعة من الحقول الفرعية المحدّدة للمصفوفات أو العناصر عن طريق وضع عبارات بين قوسين "
( )
".على سبيل المثال: لا تعرض
fields=items(id,author/email)
سوى معرّف السلعة والبريد الإلكتروني للمؤلف لكل عنصر في مصفوفة السلع. يمكنك أيضًا تحديد حقل فرعي واحد، حيث يكونfields=items(id)
مكافئًا لـfields=items/id
. - استخدِم أحرف البدل في اختيارات الحقول، إذا لزم الأمر.
على سبيل المثال:
fields=items/pagemap/*
يختار كل العناصر في خريطة الموقع.
أمثلة إضافية على استخدام المَعلمة fields
تتضمّن الأمثلة أدناه أوصافًا لكيفية تأثير قيمة المَعلمة fields
في الردّ.
ملاحظة: كما هو الحال مع جميع قيم مَعلمات طلب البحث، يجب أن تكون قيمة المَعلمة fields
بترميز عنوان URL. لتسهيل القراءة، لا تتضمّن الأمثلة الواردة في هذا المستند الترميز.
- حدِّد الحقول التي تريد عرضها، أو اختَر الحقول.
- قيمة مَعلمة الطلب
fields
هي قائمة بالحقول مفصولة بفواصل، ويتم تحديد كل حقل بالنسبة إلى جذر الاستجابة. وبالتالي، إذا كنت تنفّذ عملية قائمة، يكون الردّ عبارة عن مجموعة، ويتضمّن عادةً مصفوفة من الموارد. إذا كنت تجري عملية تعرض موردًا واحدًا، يتم تحديد الحقول بالنسبة إلى هذا المورد. إذا كان الحقل الذي تحدّده عبارة عن مصفوفة (أو جزء منها)، يعرض الخادم الجزء المحدّد من جميع العناصر في المصفوفة.
في ما يلي بعض الأمثلة على مستوى المجموعة:
أمثلة التأثير items
تعرض هذه السمة جميع العناصر في مصفوفة العناصر، بما في ذلك جميع الحقول في كل عنصر، ولكن بدون أي حقول أخرى. etag,items
تعرض هذه السمة الحقل etag
وجميع العناصر في مصفوفة العناصر.items/title
تعرِض هذه الدالة حقل title
فقط لجميع العناصر في مصفوفة العناصر.
عند عرض حقل متداخل، تتضمّن الاستجابة العناصر الرئيسية التي تحتوي على هذا الحقل. لا تتضمّن الحقول الرئيسية أي حقول فرعية أخرى ما لم يتم اختيارها بشكل صريح أيضًا.context/facets/label
تعرض هذه السمة حقل label
فقط لجميع عناصر مصفوفةfacets
، والتي تكون مضمّنة بدورها ضمن عنصرcontext
.items/pagemap/*/title
بالنسبة إلى كل عنصر في مصفوفة السلع، تعرض هذه السمة الحقل title
فقط (في حال توفّره) لجميع العناصر الثانوية للعنصرpagemap
.
في ما يلي بعض الأمثلة على مستوى المورد:
أمثلة التأثير title
تعرض هذه الطريقة الحقل title
للمورد المطلوب.author/uri
تعرض هذه السمة الحقل الفرعي uri
للعنصرauthor
في المورد المطلوب.links/*/href
تعرِض هذه الدالة الحقل href
لجميع العناصر الفرعية منlinks
. - اطلب أجزاءً فقط من حقول محدّدة باستخدام الاختيارات الفرعية.
- تلقائيًا، إذا كان طلبك يحدّد حقولاً معيّنة، يعرض الخادم الكائنات أو عناصر المصفوفة بالكامل. يمكنك تحديد ردّ يتضمّن حقولاً فرعية معيّنة فقط. يمكنك إجراء ذلك باستخدام بنية الاختيار الفرعي "
( )
"، كما هو موضّح في المثال أدناه.مثال التأثير items(title,author/uri)
تعرض هذه الدالة قيم title
وuri
الخاصة بالمؤلف فقط لكل عنصر في مصفوفة العناصر.
التعامل مع الردود الجزئية
بعد أن يعالج الخادم طلبًا صالحًا يتضمّن مَعلمة طلب البحث fields
، يعرض رمز الحالة HTTP 200 OK
، بالإضافة إلى البيانات المطلوبة. إذا كان مَعلمة طلب البحث fields
تتضمّن خطأ أو كانت غير صالحة، يعرض الخادم رمز حالة HTTP 400 Bad Request
، بالإضافة إلى رسالة خطأ تُعلم المستخدم بالمشكلة في اختيار الحقول (على سبيل المثال، "Invalid field selection a/b"
).
في ما يلي مثال على الرد الجزئي المعروض في القسم التمهيدي أعلاه. يستخدم الطلب المَعلمة fields
لتحديد الحقول التي سيتم عرضها.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
يبدو الردّ الجزئي على النحو التالي:
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
ملاحظة: بالنسبة إلى واجهات برمجة التطبيقات التي تتيح مَعلمات طلب البحث لتقسيم البيانات إلى صفحات (maxResults
وnextPageToken
، على سبيل المثال)، استخدِم هذه المَعلمات لتقليل نتائج كل طلب بحث إلى حجم يمكن إدارته. بخلاف ذلك، قد لا تتحقّق التحسينات في الأداء التي يمكن تحقيقها باستخدام الردود الجزئية.
رمز التصحيح (تحديث جزئي)
يمكنك أيضًا تجنُّب إرسال بيانات غير ضرورية عند تعديل الموارد. لإرسال بيانات معدَّلة للحقول المحدّدة التي تريد تغييرها فقط، استخدِم فعل HTTP PATCH
. تختلف دلالات التصحيح الموضّحة في هذا المستند (وهي أبسط) عن دلالات التصحيح في الإصدار القديم من التعديل الجزئي المستند إلى GData.
يوضّح المثال القصير أدناه كيف يقلّل استخدام التصحيح من حجم البيانات التي تحتاج إلى إرسالها لإجراء تعديل صغير.
مثال
يعرض هذا المثال طلب تصحيح بسيطًا لتعديل عنوان مورد واجهة برمجة التطبيقات "العرض التوضيحي" (الوهمي) فقط. يحتوي المرجع أيضًا على تعليق ومجموعة من الخصائص والحالة والعديد من الحقول الأخرى، ولكن هذا الطلب يرسل الحقل title
فقط، لأنّه الحقل الوحيد الذي يتم تعديله:
PATCH https://www.googleapis.com/demo/v1/324 Authorization: Bearer your_auth_token Content-Type: application/json { "title": "New title" }
الرد:
200 OK
{ "title": "New title", "comment": "First comment.", "characteristics": { "length": "short", "accuracy": "high", "followers": ["Jo", "Will"], }, "status": "active", ... }
يعرض الخادم رمز الحالة 200 OK
، بالإضافة إلى التمثيل الكامل للمورد المعدَّل. بما أنّه تم تضمين الحقل title
فقط في طلب التصحيح، هذه هي القيمة الوحيدة التي تختلف عن القيمة السابقة.
ملاحظة: إذا كنت تستخدم المَعلمة الرد الجزئي fields
مع التصحيح، يمكنك زيادة كفاءة طلبات التعديل بشكل أكبر. يؤدي طلب التصحيح إلى تقليل حجم الطلب فقط. يقلّل الردّ الجزئي من حجم الردّ. لتقليل مقدار البيانات المُرسَلة في كلا الاتجاهين، استخدِم طلب تصحيح مع المَعلمة fields
.
دلالات طلب التصحيح
يتضمّن نص طلب التعديل حقول المورد التي تريد تعديلها فقط. عند تحديد حقل، يجب تضمين أي عناصر رئيسية محيطة، تمامًا كما يتم عرض العناصر الرئيسية المحيطة مع ردّ جزئي. يتم دمج البيانات المعدَّلة التي ترسلها في بيانات العنصر الأصل، إذا كان هناك عنصر أصل.
- إضافة: لإضافة حقل غير متوفّر حاليًا، حدِّد الحقل الجديد وقيمته.
- تعديل: لتغيير قيمة حقل حالي، حدِّد الحقل واضبطه على القيمة الجديدة.
- حذف: لحذف حقل، حدِّد الحقل واضبطه على
null
. على سبيل المثال،"comment": null
. يمكنك أيضًا حذف كائن بأكمله (إذا كان قابلاً للتغيير) من خلال ضبطه علىnull
. إذا كنت تستخدم مكتبة برامج Java API، استخدِمData.NULL_STRING
بدلاً من ذلك. لمزيد من التفاصيل، اطّلِع على JSON null.
ملاحظة حول المصفوفات: تستبدل طلبات التصحيح التي تحتوي على مصفوفات المصفوفة الحالية بالمصفوفة التي تقدّمها. لا يمكنك تعديل العناصر في مصفوفة أو إضافتها أو حذفها بشكل جزئي.
استخدام التصحيح في دورة القراءة والتعديل والكتابة
يمكن أن تكون هذه العملية مفيدة للبدء باسترداد ردّ جزئي يتضمّن البيانات التي تريد تعديلها. ويكون ذلك مهمًا بشكل خاص للموارد التي تستخدم علامات ETag، إذ يجب تقديم قيمة علامة ETag الحالية في عنوان HTTP الخاص بـ If-Match
من أجل تعديل المورد بنجاح. بعد الحصول على البيانات، يمكنك تعديل القيم التي تريد تغييرها وإعادة إرسال التمثيل الجزئي المعدَّل باستخدام طلب تصحيح. في ما يلي مثال يفترض أنّ مورد العرض التوضيحي يستخدم علامات ETag:
GET https://www.googleapis.com/demo/v1/324?fields=etag,title,comment,characteristics Authorization: Bearer your_auth_token
في ما يلي الردّ الجزئي:
200 OK
{ "etag": "ETagString" "title": "New title" "comment": "First comment.", "characteristics": { "length": "short", "level": "5", "followers": ["Jo", "Will"], } }
يستند طلب التصحيح التالي إلى هذا الردّ. كما هو موضّح أدناه، تستخدم هذه الطريقة أيضًا المَعلمة fields
للحدّ من البيانات التي يتم عرضها في ردّ التصحيح:
PATCH https://www.googleapis.com/demo/v1/324?fields=etag,title,comment,characteristics Authorization: Bearer your_auth_token Content-Type: application/json If-Match: "ETagString"
{ "etag": "ETagString" "title": "", /* Clear the value of the title by setting it to the empty string. */ "comment": null, /* Delete the comment by replacing its value with null. */ "characteristics": { "length": "short", "level": "10", /* Modify the level value. */ "followers": ["Jo", "Liz"], /* Replace the followers array to delete Will and add Liz. */ "accuracy": "high" /* Add a new characteristic. */ }, }
يستجيب الخادم برمز حالة HTTP 200 OK، والتمثيل الجزئي للمورد المعدَّل:
200 OK
{ "etag": "newETagString" "title": "", /* Title is cleared; deleted comment field is missing. */ "characteristics": { "length": "short", "level": "10", /* Value is updated.*/ "followers": ["Jo" "Liz"], /* New follower Liz is present; deleted Will is missing. */ "accuracy": "high" /* New characteristic is present. */ } }
إنشاء طلب تصحيح مباشرةً
بالنسبة إلى بعض طلبات التصحيح، عليك استنادها إلى البيانات التي استرجعتها سابقًا. على سبيل المثال، إذا أردت إضافة عنصر إلى مصفوفة ولا تريد فقدان أي من عناصر المصفوفة الحالية، عليك الحصول على البيانات الحالية أولاً. وبالمثل، إذا كانت إحدى واجهات برمجة التطبيقات تستخدم علامات ETag، عليك إرسال قيمة ETag السابقة مع طلبك لتعديل المورد بنجاح.
ملاحظة: يمكنك استخدام عنوان HTTP يتضمّن "If-Match: *"
لفرض تطبيق تصحيح عندما تكون علامات ETag قيد الاستخدام. إذا نفّذت ذلك، لن تحتاج إلى إجراء عملية القراءة قبل الكتابة.
في حالات أخرى، يمكنك إنشاء طلب التصحيح مباشرةً، بدون استرداد البيانات الحالية أولاً. على سبيل المثال، يمكنك إعداد طلب تصحيح يعدّل حقلاً إلى قيمة جديدة أو يضيف حقلاً جديدًا بسهولة. يُرجى الاطّلاع على المثال أدناه:
PATCH https://www.googleapis.com/demo/v1/324?fields=comment,characteristics Authorization: Bearer your_auth_token Content-Type: application/json { "comment": "A new comment", "characteristics": { "volume": "loud", "accuracy": null } }
باستخدام هذا الطلب، إذا كان حقل التعليق يتضمّن قيمة حالية، ستستبدلها القيمة الجديدة، وإلا سيتم ضبطها على القيمة الجديدة. وبالمثل، إذا كانت هناك سمة مستوى صوت، سيتم استبدال قيمتها، وإذا لم تكن هناك سمة، سيتم إنشاؤها. تتم إزالة حقل الدقة، إذا تم ضبطه.
التعامل مع الردّ على تصحيح
بعد معالجة طلب تصحيح صالح، تعرض واجهة برمجة التطبيقات رمز استجابة HTTP 200 OK
بالإضافة إلى التمثيل الكامل للمورد المعدَّل. إذا كانت واجهة برمجة التطبيقات تستخدم علامات ETag، يحدّث الخادم قيم علامات ETag عند معالجة طلب تصحيح بنجاح، تمامًا كما يفعل مع PUT
.
يعرض طلب التصحيح تمثيل المورد بالكامل ما لم تستخدم المَعلمة fields
لتقليل مقدار البيانات التي يعرضها.
إذا أدّى طلب تصحيح إلى حالة مورد جديدة غير صالحة من الناحية التركيبية أو الدلالية، يعرض الخادم رمز حالة HTTP 400 Bad Request
أو 422 Unprocessable Entity
، وتبقى حالة المورد بدون تغيير. على سبيل المثال، إذا حاولت حذف قيمة حقل مطلوب، سيعرض الخادم رسالة خطأ.
صيغة بديلة عندما لا يكون فعل PATCH HTTP متاحًا
إذا كان جدار الحماية لا يسمح بطلبات HTTP PATCH
، يمكنك إرسال طلب HTTP POST
وتعيين عنوان التجاوز على PATCH
، كما هو موضّح أدناه:
POST https://www.googleapis.com/... X-HTTP-Method-Override: PATCH ...
الفرق بين التصحيح والتحديث
في الواقع، عند إرسال بيانات لطلب تعديل يستخدم فعل HTTP PUT
، ما عليك سوى إرسال الحقول المطلوبة أو الاختيارية. وإذا أرسلت قيمًا للحقول التي يضبطها الخادم، سيتم تجاهلها. على الرغم من أنّ هذه الطريقة قد تبدو كطريقة أخرى لإجراء تعديل جزئي، إلا أنّها تتضمّن بعض القيود. مع التعديلات التي تستخدم فعل HTTP PUT
، يتعذّر تنفيذ الطلب إذا لم تقدّم المَعلمات المطلوبة، كما أنّه يمحو البيانات التي تم ضبطها سابقًا إذا لم تقدّم المَعلمات الاختيارية.
ولهذا السبب، من الأفضل استخدام التصحيح. عليك تقديم البيانات فقط للحقول التي تريد تغييرها، ولن يتم محو الحقول التي تحذفها. الاستثناء الوحيد لهذه القاعدة هو العناصر أو المصفوفات المتكررة: إذا حذفتها كلها، ستبقى كما هي، وإذا قدّمت أيًا منها، سيتم استبدال المجموعة بأكملها بالمجموعة التي تقدّمها.