مدیریت عملیات طولانی مدت

یک عملیات طولانی مدت (LRO) یک روش API است که تکمیل آن زمان بیشتری نسبت به زمان مناسب برای پاسخ API طول می‌کشد. معمولاً شما نمی‌خواهید نخ فراخوانی را در حین اجرای وظیفه باز نگه دارید زیرا تجربه کاربری ضعیفی را ارائه می‌دهد. در عوض، بهتر است نوعی promise را به کاربر برگردانید و به او اجازه دهید بعداً بررسی کند.

هر بار که متد download را روی منبع files فراخوانی می‌کنید تا محتوای یک فایل را از طریق API درایو یا کتابخانه‌های کلاینت آن دانلود کنید، API گوگل درایو یک LRO برمی‌گرداند.

این متد یک منبع operations را به کلاینت برمی‌گرداند. شما می‌توانید از منبع operations برای بازیابی ناهمگام وضعیت متد API با نمونه‌برداری از عملیات از طریق متد get استفاده کنید. LROها در Drive API از الگوی طراحی Google Cloud LRO پیروی می‌کنند.

برای اطلاعات بیشتر، به عملیات طولانی مدت مراجعه کنید.

مرور کلی فرآیند

نمودار زیر مراحل سطح بالای نحوه‌ی عملکرد متد file.download را نشان می‌دهد.

مراحل سطح بالا برای متد file.download.
شکل ۱. مراحل سطح بالا برای روش file.download.

  1. فراخوانی files.download : وقتی برنامه شما متد download را فراخوانی می‌کند، درخواست دانلود فایل از Drive API را اجرا می‌کند. برای اطلاعات بیشتر، به Download files مراجعه کنید.

  2. درخواست مجوزها : این درخواست، اعتبارنامه‌های احراز هویت را به Drive API ارسال می‌کند. اگر برنامه شما نیاز به فراخوانی Drive API با استفاده از احراز هویت کاربری که هنوز اعطا نشده است، داشته باشد، از کاربر می‌خواهد که وارد سیستم شود. برنامه شما همچنین درخواست دسترسی با محدوده‌هایی را می‌کند که هنگام تنظیم احراز هویت مشخص می‌کنید.

  3. شروع دانلود : یک درخواست از API درایو برای شروع دانلود فایل ارسال می‌شود. این درخواست می‌تواند به Google Vids یا برخی دیگر از محتوای Google Workspace ارسال شود.

  4. شروع LRO : یک عملیات طولانی مدت آغاز می‌شود و فرآیند دانلود را مدیریت می‌کند.

  5. بازگرداندن عملیات در حال انتظار : Drive API یک عملیات در حال انتظار را برمی‌گرداند که حاوی اطلاعاتی درباره کاربری است که درخواست را انجام داده و چندین فیلد فراداده فایل است.

  6. وضعیت در حال انتظار اولیه : برنامه شما عملیات در حال انتظار را به همراه وضعیت در حال انتظار اولیه done=null دریافت می‌کند. این نشان می‌دهد که فایل هنوز آماده دانلود نیست و وضعیت عملیات در حال انتظار است.

  7. فراخوانی operations.get و تأیید نتیجه : برنامه شما در فواصل زمانی توصیه‌شده، تابع get را فراخوانی می‌کند تا نتیجه عملیات را بررسی کرده و آخرین وضعیت یک عملیات طولانی‌مدت را دریافت کند. اگر وضعیت در حال انتظار done=false برگردانده شود، برنامه شما باید تا زمانی که عملیات وضعیت تکمیل‌شده ( done=true ) را برگرداند، به بررسی ادامه دهد. برای فایل‌های بزرگ، انتظار می‌رود چندین بار بررسی انجام شود. برای اطلاعات بیشتر، به بخش «دریافت جزئیات مربوط به یک عملیات طولانی‌مدت» مراجعه کنید.

  8. بررسی وضعیت در حال انتظار : اگر وضعیت در حال انتظار done=true از LRO برگردانده شود، این نشان می‌دهد که فایل آماده دانلود است و وضعیت عملیات کامل شده است.

  9. بازگرداندن عملیات تکمیل‌شده به همراه آدرس دانلود : پس از اتمام عملیات LRO، Drive API آدرس دانلود را برمی‌گرداند و فایل اکنون در دسترس کاربر قرار دارد.

دانلود فایل‌ها

برای دانلود محتوا تحت یک عملیات طولانی مدت، از متد download روی منبع files استفاده کنید. این متد پارامترهای file_id ، mime_type و revision_id را دریافت می‌کند:

  • الزامی. پارامتر مسیر file_id ، شناسه فایلی است که قرار است دانلود شود.

  • اختیاری. پارامتر پرس‌وجوی mime_type نوع MIME مورد استفاده در روش را نشان می‌دهد. این پارامتر فقط هنگام دانلود محتوای رسانه‌ای غیر blob (مانند اسناد Google Workspace) در دسترس است. برای فهرست کاملی از انواع MIME پشتیبانی‌شده، به Export MIME types for Google Workspace documents مراجعه کنید.

    اگر نوع MIME تنظیم نشده باشد، سند Google Workspace با نوع MIME پیش‌فرض دانلود می‌شود. برای اطلاعات بیشتر، به انواع MIME پیش‌فرض مراجعه کنید.

  • اختیاری. پارامتر کوئری revision_id ، شناسه‌ی ویرایش فایلی است که قرار است دانلود شود. این پارامتر فقط هنگام دانلود فایل‌های blob، Google Docs و Google Sheets در دسترس است. هنگام دانلود یک ویرایش خاص روی فایل‌های پشتیبانی نشده، کد خطای INVALID_ARGUMENT را برمی‌گرداند.

روش download تنها راه برای دانلود فایل‌های Vids با فرمت MP4 است و معمولاً برای دانلود اکثر فایل‌های ویدیویی مناسب‌تر است.

لینک‌های دانلود ایجاد شده برای Google Docs یا Sheets در ابتدا یک تغییر مسیر (ریدایرکت) برمی‌گردانند. برای دانلود فایل، روی لینک جدید کلیک کنید.

درخواست به روش download که LRO را آغاز می‌کند، و درخواست برای دریافت URI دانلود نهایی، هر دو باید از کلیدهای منبع استفاده کنند. برای اطلاعات بیشتر، به دسترسی به فایل‌های درایو لینک-اشتراک‌گذاری شده با استفاده از کلیدهای منبع مراجعه کنید.

پروتکل درخواست در اینجا نشان داده شده است.

POST https://www.googleapis.com/drive/v3/files/{FILE_ID}/download

به جای FILE_ID fileId فایلی که می‌خواهید دانلود کنید را قرار دهید.

انواع پیش‌فرض MIME

اگر هنگام دانلود محتوای غیر blob نوع MIME تنظیم نشده باشد، انواع MIME پیش‌فرض زیر اختصاص داده می‌شوند:

نوع سند قالب نوع MIME پسوند فایل
اسکریپت برنامه‌های گوگل جی‌سان فایل application/vnd.google-apps.script+json .json
اسناد گوگل مایکروسافت ورد application/vnd.openxmlformats-officedocument.wordprocessingml.document .docx
نقشه‌های گوگل پی ان جی تصویر/png .png
فرم‌های گوگل زیپ برنامه/فایل فشرده فایل زیپ
صفحات گوگل مایکروسافت اکسل application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .xlsx
سایت‌های گوگل متن خام متن/خام .txt
اسلایدهای گوگل مایکروسافت پاورپوینت application/vnd.openxmlformats-officedocument.presentationml.presentation .pptx
گوگل ویدز ام پی ۴ برنامه/mp4 .mp4
تخته جام پی دی اف برنامه/pdf پی دی اف

دانلود پاسخ

هنگام فراخوانی متد download ، بدنه پاسخ شامل منبعی است که نشان‌دهنده یک عملیات طولانی‌مدت است. این متد معمولاً لینکی را برای دانلود محتوای فایل برمی‌گرداند.

{
  "done": true,
  "metadata": {
    "@type": "type.googleapis.com/google.apps.drive.v3.DownloadFileMetadata",
    "resourceKey": "RESOURCE_KEY"
  },
  "name": "NAME",
  "response": {
    "@type";: "type.googleapis.com/google.apps.drive.v3.DownloadFileResponse",
    "downloadUri": "DOWNLOAD_URI",
    "partialDownloadAllowed": false
  }
}

این خروجی شامل مقادیر زیر است:

توجه داشته باشید که فیلد partialDownloadAllowed نشان می‌دهد که آیا دانلود جزئی مجاز است یا خیر و هنگام دانلود محتوای فایل blob مقدار آن true است.

جزئیات مربوط به یک عملیات طولانی مدت را دریافت کنید

عملیات طولانی‌مدت، فراخوانی متدهایی هستند که ممکن است زمان قابل توجهی برای تکمیل شدن نیاز داشته باشند. معمولاً عملیات دانلود تازه ایجاد شده، در ابتدا در حالت انتظار ( done=null ) برگردانده می‌شوند، مخصوصاً برای فایل‌های Vids.

شما می‌توانید از منبع operations که Drive API ارائه می‌دهد، برای بررسی وضعیت پردازش LRO با وارد کردن نام منحصر به فرد اختصاص داده شده توسط سرور، استفاده کنید.

متد get آخرین وضعیت یک عملیات طولانی مدت را به صورت غیرهمزمان دریافت می‌کند. کلاینت‌ها می‌توانند از این متد برای نظرسنجی از نتیجه عملیات در فواصل زمانی توصیه شده توسط سرویس API استفاده کنند.

نظرسنجی از یک عملیات طولانی مدت

برای نمونه‌برداری از یک LRO موجود، متد get را مکرراً فراخوانی کنید تا عملیات تمام شود. بین هر درخواست نمونه‌برداری، مثلاً ۱۰ ثانیه، از یک backoff نمایی استفاده کنید.

یک LRO حداقل به مدت ۱۲ ساعت در دسترس است، اما در برخی موارد می‌تواند بیشتر نیز دوام بیاورد. این مدت زمان ممکن است تغییر کند و بسته به نوع فایل می‌تواند متفاوت باشد. پس از انقضای منبع، درخواست روش download جدید ضروری است.

هرگونه درخواستی برای get باید از کلیدهای منبع استفاده کند. برای اطلاعات بیشتر، به «دسترسی به فایل‌های درایو اشتراکی لینک‌شده با استفاده از کلیدهای منبع» مراجعه کنید.

پروتکل‌های درخواست در اینجا نشان داده شده‌اند.

فراخوانی متد

operations.get(name='NAME');

همانطور که در پاسخ به درخواست متد download نشان داده شده است، NAME با نام اختصاص داده شده توسط سرور برای عملیات جایگزین کنید.

حلقه زدن

curl -i -H \
      'Authorization: Bearer $(gcloud auth print-access-token)" \
      'https://googleapis.com/drive/v3/operations/NAME?alt=json'

همانطور که در پاسخ به درخواست متد download نشان داده شده است، NAME با نام اختصاص داده شده توسط سرور برای عملیات جایگزین کنید.

این دستور از مسیر /drive/v3/operations/ NAME ‎ استفاده می‌کند.

توجه داشته باشید که name فقط در پاسخ به درخواست download برگردانده می‌شود. هیچ راه دیگری برای بازیابی آن وجود ندارد زیرا Drive API از متد list پشتیبانی نمی‌کند. اگر مقدار name از بین برود، باید با فراخوانی مجدد درخواست متد download ، پاسخ جدیدی ایجاد کنید.

پاسخ یک درخواست get شامل منبعی است که نشان‌دهنده‌ی یک عملیات طولانی‌مدت است. برای اطلاعات بیشتر، به بخش «پاسخ دانلود» مراجعه کنید.

وقتی پاسخ شامل وضعیت تکمیل‌شده ( done=true ) باشد، عملیات طولانی‌مدت به پایان رسیده است.

دانلود نسخه اصلاح‌شده

شما می‌توانید از مقدار فیلد headRevisionId از منبع files برای دانلود آخرین نسخه استفاده کنید. این کار، نسخه‌ای را که مربوط به فراداده‌های فایلی است که قبلاً بازیابی کرده‌اید، بازیابی می‌کند. برای دانلود داده‌های مربوط به تمام نسخه‌های قبلی فایل که هنوز در ابر ذخیره شده‌اند، می‌توانید متد list را در منبع revisions با پارامتر fileId فراخوانی کنید. این متد تمام revisionIds موجود در فایل را برمی‌گرداند.

برای دانلود محتوای نسخه‌های فایل‌های blob، باید متد get را روی منبع revisions با شناسه فایل مورد نظر برای دانلود، شناسه نسخه و پارامتر alt=media URL فراخوانی کنید. پارامتر alt=media URL به سرور می‌گوید که دانلود محتوا به عنوان یک فرمت پاسخ جایگزین درخواست شده است.

نمی‌توان با استفاده از متد get و آدرس alt=media نسخه‌های اصلاح‌شده‌ی فایل‌های Google Docs، Sheets، Slides و Vids را دانلود کرد. در غیر این صورت، خطای fileNotDownloadable ایجاد می‌شود.

پارامتر alt=media URL یک پارامتر سیستمی است که در تمام APIهای REST گوگل موجود است. اگر از یک کتابخانه کلاینت برای Drive API استفاده می‌کنید، نیازی به تنظیم صریح این پارامتر ندارید.

پروتکل درخواست در اینجا نشان داده شده است.

GET https://www.googleapis.com/drive/v3/files/{FILE_ID}/revisions/{REVISION_ID}?alt=media

موارد زیر را جایگزین کنید:

  • FILE_ID : fileId فایلی که می‌خواهید دانلود کنید.
  • REVISION_ID : شناسه‌ی ویرایش revisionId ویرایشی که می‌خواهید دانلود کنید.

نسخه‌های Google Docs، Drawings و Slides به طور خودکار شماره‌های نسخه را افزایش می‌دهند. با این حال، اگر نسخه‌ها حذف شوند، ممکن است سری اعداد دارای فاصله باشند، بنابراین نباید برای بازیابی نسخه‌ها به شماره‌های متوالی تکیه کنید.

عیب‌یابی LROها

وقتی یک LRO از کار می‌افتد، پاسخ آن شامل یک کد خطای متعارف Google Cloud است.

جدول زیر هر کد خطا، کد وضعیت HTTP نگاشت شده، توضیحات و توصیه‌ای برای نحوه مدیریت کد خطا را نمایش می‌دهد. برای بسیاری از خطاها، اقدام توصیه شده این است که درخواست را دوباره با استفاده از exponential backoff امتحان کنید.

می‌توانید اطلاعات بیشتر در مورد این مدل خطا و نحوه کار با آن را در راهنمای طراحی API مطالعه کنید.

کد شمارشی کد وضعیت HTTP توضیحات اقدام توصیه شده
۱ CANCELLED 499 Client Closed Request این عملیات، معمولاً توسط تماس گیرنده، لغو می‌شد. عملیات را دوباره اجرا کنید.
۲ UNKNOWN 500 Internal Server Error این خطا ممکن است زمانی برگردانده شود که مقدار Status دریافت شده از فضای آدرس دیگری متعلق به فضای خطایی باشد که در این فضای آدرس شناخته شده نیست. اگر خطای API اطلاعات کافی را برنگرداند، ممکن است خطا به این خطا تبدیل شود. با استفاده از backoff نمایی دوباره امتحان کنید.
۳ INVALID_ARGUMENT 400 Bad Request کلاینت یک آرگومان نامعتبر مشخص کرده است. این خطا با FAILED_PRECONDITION متفاوت است. INVALID_ARGUMENT نشان دهنده آرگومان‌هایی است که صرف نظر از وضعیت سیستم، مشکل‌ساز هستند، مانند نام فایل نادرست. بدون رفع مشکل دوباره امتحان نکنید.
۴ DEADLINE_EXCEEDED 504 Gateway Timeout مهلت قبل از اتمام عملیات به پایان رسیده است. برای عملیاتی که وضعیت سیستم را تغییر می‌دهند، این خطا ممکن است حتی اگر عملیات با موفقیت انجام شده باشد، بازگردانده شود. به عنوان مثال، پاسخ موفقیت‌آمیز از سرور می‌تواند به اندازه کافی به تأخیر بیفتد تا مهلت منقضی شود. با استفاده از backoff نمایی دوباره امتحان کنید.
۵ NOT_FOUND 404 Not Found برخی از موجودیت‌های درخواستی، مانند منبع FHIR، یافت نشدند. بدون رفع مشکل دوباره امتحان نکنید.
۶ ALREADY_EXISTS 409 Conflict موجودیتی که کلاینت سعی در ایجاد آن داشته است، مانند یک نمونه DICOM، از قبل وجود دارد. بدون رفع مشکل دوباره امتحان نکنید.
۷ PERMISSION_DENIED 403 Forbidden فراخواننده مجوز اجرای عملیات مشخص شده را ندارد. این کد خطا به این معنی نیست که درخواست معتبر است، موجودیت درخواست شده وجود دارد یا سایر پیش‌شرط‌ها را برآورده می‌کند. بدون رفع مشکل دوباره امتحان نکنید.
۸ RESOURCE_EXHAUSTED 429 Too Many Requests برخی از منابع، مانند سهمیه هر پروژه، تمام شده‌اند. با استفاده از روش backoff نمایی دوباره امتحان کنید. سهمیه ممکن است به مرور زمان در دسترس قرار گیرد.
۹ FAILED_PRECONDITION 400 Bad Request این عملیات رد شد زیرا سیستم در حالت مورد نیاز برای اجرای عملیات نیست. برای مثال، دایرکتوری که قرار است حذف شود خالی نیست، یا عملیات rmdir روی یک دایرکتوری غیر از دایرکتوری اعمال شده است. بدون رفع مشکل دوباره امتحان نکنید.
۱۰ ABORTED 409 Conflict این عملیات معمولاً به دلیل یک مشکل همزمانی مانند خرابی بررسی ترتیب‌سنج یا لغو تراکنش، لغو شد. با استفاده از backoff نمایی دوباره امتحان کنید.
۱۱ OUT_OF_RANGE 400 Bad Request این عملیات فراتر از محدوده‌ی مجاز انجام شده است، مانند جستجو یا خواندن فراتر از انتهای فایل. برخلاف INVALID_ARGUMENT ، این خطا نشان دهنده‌ی مشکلی است که در صورت تغییر وضعیت سیستم، ممکن است برطرف شود. بدون رفع مشکل دوباره امتحان نکنید.
۱۲ UNIMPLEMENTED 501 Not Implemented این عملیات در Drive API پیاده‌سازی نشده یا پشتیبانی/فعال نشده است. دوباره امتحان نکن.
۱۳ INTERNAL 500 Internal Server Error خطاهای داخلی. این نشان می‌دهد که یک خطای غیرمنتظره در پردازش روی سیستم اصلی رخ داده است. با استفاده از backoff نمایی دوباره امتحان کنید.
۱۴ UNAVAILABLE 503 Service Unavailable رابط برنامه‌نویسی کاربردی درایو (Drive API) در دسترس نیست. این به احتمال زیاد یک وضعیت گذرا است که می‌توان آن را با تلاش مجدد با روش بازگشت نمایی اصلاح کرد. توجه داشته باشید که تلاش مجدد برای عملیات غیرخودتوان همیشه ایمن نیست. با استفاده از backoff نمایی دوباره امتحان کنید.
۱۵ DATA_LOSS 500 Internal Server Error از دست رفتن یا خرابی غیرقابل بازیابی داده‌ها. با مدیر سیستم خود تماس بگیرید. در صورت بروز هرگونه مشکل یا از دست رفتن داده‌ها، مدیر سیستم ممکن است بخواهد با یک نماینده پشتیبانی تماس بگیرد.
۱۶ UNAUTHENTICATED 401 Unauthorized درخواست، اعتبارنامه‌های احراز هویت معتبری برای عملیات ندارد. بدون رفع مشکل دوباره امتحان نکنید.