این سند برخی از تکنیکهایی را که میتوانید برای بهبود عملکرد برنامه خود استفاده کنید، پوشش میدهد. در برخی موارد، از مثالهایی از APIهای دیگر یا APIهای عمومی برای نشان دادن ایدههای ارائه شده استفاده شده است. با این حال، همین مفاهیم برای Google Content API برای خرید نیز قابل استفاده هستند.
فشردهسازی با استفاده از gzip
یک راه آسان و راحت برای کاهش پهنای باند مورد نیاز برای هر درخواست، فعال کردن فشردهسازی gzip است. اگرچه این کار به زمان اضافی CPU برای خارج کردن نتایج از حالت فشرده نیاز دارد، اما معمولاً با توجه به هزینههای شبکه، ارزش انجام آن را دارد.
برای دریافت پاسخی که با gzip کدگذاری شده است، باید دو کار انجام دهید: یک هدر Accept-Encoding تنظیم کنید و عامل کاربر خود را طوری تغییر دهید که شامل رشته gzip باشد. در اینجا مثالی از هدرهای HTTP که به درستی شکل گرفتهاند برای فعال کردن فشردهسازی gzip آورده شده است:
Accept-Encoding: gzip User-Agent: my program (gzip)
کار با منابع جزئی
راه دیگر برای بهبود عملکرد فراخوانیهای API شما، درخواست فقط بخشی از دادههایی است که به آنها علاقهمند هستید. این به برنامه شما اجازه میدهد از انتقال، تجزیه و ذخیره فیلدهای غیرضروری جلوگیری کند، بنابراین میتواند از منابعی از جمله شبکه، CPU و حافظه به طور مؤثرتری استفاده کند.
پاسخ جزئی
به طور پیشفرض، سرور پس از پردازش درخواستها، نمایش کامل یک منبع را ارسال میکند. برای عملکرد بهتر، میتوانید از سرور بخواهید که فقط فیلدهایی را که واقعاً به آنها نیاز دارید ارسال کند و در عوض، پاسخی جزئی دریافت کنید.
برای درخواست پاسخ جزئی، از پارامتر درخواست fields برای مشخص کردن فیلدهایی که میخواهید برگردانده شوند استفاده کنید. میتوانید از این پارامتر با هر درخواستی که دادههای پاسخ را برمیگرداند، استفاده کنید.
مثال
مثال زیر استفاده از پارامتر fields را با یک API عمومی (تخیلی) "Demo" نشان میدهد.
درخواست ساده: این درخواست 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قرار دارد استفاده کنید.استثنا: برای پاسخهای API که از پوششهای "data" استفاده میکنند، که در آن پاسخ درون یک شیء
dataکه شبیهdata: { ... }است، قرار میگیرد، "data" را در مشخصاتfieldsوارد نکنید. وارد کردن شیء داده با مشخصات فیلدهایی مانندdata/a/bباعث خطا میشود. در عوض، فقط از مشخصاتfieldsمانندa/bاستفاده کنید. - با قرار دادن عبارات درون پرانتز "
( )" از یک زیر-انتخابگر برای درخواست مجموعهای از زیر-فیلدهای خاص از آرایهها یا اشیاء استفاده کنید.برای مثال:
fields=items(id,author/email)فقط شناسه آیتم و ایمیل نویسنده را برای هر عنصر در آرایه items برمیگرداند. همچنین میتوانید یک زیرفیلد مشخص کنید، که در آنfields=items(id)معادلfields=items/idاست. - در صورت نیاز، از کاراکترهای عمومی (wildcards) در انتخاب فیلدها استفاده کنید.
برای مثال:
fields=items/pagemap/*تمام اشیاء موجود در یک نقشه صفحه را انتخاب میکند.
مثالهای بیشتر از استفاده از پارامتر fields
مثالهای زیر شامل توضیحاتی در مورد چگونگی تأثیر مقدار پارامتر fields بر پاسخ است.
توجه: همانند تمام مقادیر پارامترهای پرسوجو، مقدار پارامتر fields باید به صورت URL کدگذاری شود. برای خوانایی بهتر، مثالهای این سند از کدگذاری صرف نظر کردهاند.
- فیلدهایی را که میخواهید برگردانده شوند، شناسایی کنید یا انتخابهای فیلدی انجام دهید.
- مقدار پارامتر درخواست
fields، فهرستی از فیلدها است که با کاما از هم جدا شدهاند و هر فیلد نسبت به ریشه پاسخ مشخص میشود. بنابراین، اگر شما در حال انجام یک عملیات فهرستسازی هستید، پاسخ یک مجموعه است و عموماً شامل آرایهای از منابع است. اگر در حال انجام عملیاتی هستید که یک منبع واحد را برمیگرداند، فیلدها نسبت به آن منبع مشخص میشوند. اگر فیلدی که انتخاب میکنید (یا بخشی از) یک آرایه باشد، سرور بخش انتخاب شده از تمام عناصر موجود در آرایه را برمیگرداند.
در اینجا چند مثال در سطح مجموعه آورده شده است:مثالها اثر itemsتمام عناصر موجود در آرایه items، شامل تمام فیلدهای هر عنصر، اما بدون فیلدهای دیگر را برمیگرداند. etag,itemsهم فیلد etagو هم تمام عناصر موجود در آرایه items را برمیگرداند.items/titleفقط فیلد titleرا برای همه عناصر موجود در آرایه items برمیگرداند.
هر زمان که یک فیلد تو در تو برگردانده شود، پاسخ شامل اشیاء والدِ در برگیرنده آن نیز میشود. فیلدهای والد شامل هیچ فیلد فرزند دیگری نمیشوند، مگر اینکه آنها نیز به صراحت انتخاب شوند.context/facets/labelفقط فیلد labelرا برای همه اعضای آرایهfacetsبرمیگرداند، که خود زیر شیءcontextقرار دارد.items/pagemap/*/titleبرای هر عنصر در آرایه items، فقط فیلد title(در صورت وجود) تمام اشیاء فرزندpagemapبرمیگرداند.
در اینجا چند مثال در سطح منابع آورده شده است:مثالها اثر titleفیلد titleمنبع درخواستی را برمیگرداند.author/uriزیرفیلد uriمربوط به شیءauthorدر منبع درخواستی را برمیگرداند.links/*/hrefفیلد hrefتمام اشیاء فرزندlinksرا برمیگرداند. - فقط بخشهایی از فیلدهای خاص را با استفاده از زیرگزینهها درخواست کنید.
- به طور پیشفرض، اگر درخواست شما فیلدهای خاصی را مشخص کند، سرور اشیاء یا عناصر آرایه را به طور کامل برمیگرداند. میتوانید پاسخی را مشخص کنید که فقط شامل زیرفیلدهای خاصی باشد. این کار را با استفاده از سینتکس زیر-انتخاب "
( )" انجام میدهید، مانند مثال زیر.مثال اثر items(title,author/uri)فقط مقادیر titleوuriنویسنده را برای هر عنصر در آرایه items برمیگرداند.
مدیریت پاسخهای جزئی
پس از اینکه سرور یک درخواست معتبر که شامل پارامتر جستجوی 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"
}
},
...
]
} نکته: برای APIهایی که از پارامترهای پرسوجو برای صفحهبندی دادهها پشتیبانی میکنند (مثلاً maxResults و nextPageToken )، از این پارامترها برای کاهش نتایج هر پرسوجو به اندازهای قابل مدیریت استفاده کنید. در غیر این صورت، ممکن است افزایش عملکرد ممکن با پاسخ جزئی محقق نشود.