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

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

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

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

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

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

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

مراحل سطح بالا برای روش file.download.
شکل 1. مراحل سطح بالا برای روش file.download.

  1. Call files.download : هنگامی که برنامه شما متد download() را فراخوانی می کند، درخواست دانلود Drive API را برای فایل اجرا می کند. برای اطلاعات بیشتر به دانلود فایل ها مراجعه کنید.

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

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

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

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

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

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

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

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

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

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

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

  • اختیاری. پارامتر query mime_type نشان دهنده نوع MIME است که روش باید استفاده کند. فقط هنگام بارگیری محتوای رسانه ای غیر حباب (مانند اسناد Google Workspace) در دسترس است. برای فهرست کامل انواع MIME پشتیبانی شده، صادرات انواع MIME برای اسناد Google Workspace را ببینید.

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

  • اختیاری. پارامتر query 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 پیش فرض

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

نوع سند قالب نوع MIME پسوند فایل
اسکریپت Google Apps JSON application/vnd.google-apps.script+json json
Google Docs مایکروسافت ورد application/vnd.openxmlformats-officedocument.wordprocessingml.document .docx
نقشه های گوگل PNG تصویر/png .png
فرم های گوگل ZIP برنامه/زیپ zip
Google Sheets مایکروسافت اکسل application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
سایت های گوگل متن خام متن/خام txt
اسلایدهای گوگل پاورپوینت مایکروسافت application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
Google Vids MP4 برنامه/mp4 mp4
Jamboard PDF اپلیکیشن/pdf .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.

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

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

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

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

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

برای نظرسنجی یک LRO موجود، متد get() را به طور مکرر فراخوانی کنید تا زمانی که عملیات به پایان برسد. بین هر درخواست نظرسنجی از یک عقب‌نشینی نمایی مانند 10 ثانیه استفاده کنید.

LRO برای حداقل 12 ساعت در دسترس باقی می ماند، اما در برخی موارد می تواند مدت بیشتری باقی بماند. این مدت در معرض تغییر است و می تواند بین انواع فایل متفاوت باشد. پس از انقضای منبع، درخواست متد 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 برای دانلود آخرین نسخه استفاده کنید. این ویرایشی را واکشی می کند که با فراداده فایلی که قبلاً بازیابی کرده اید مطابقت دارد. برای دانلود داده‌های تمام نسخه‌های قبلی فایل که هنوز در فضای ابری ذخیره می‌شوند، می‌توانید با پارامتر fileId متد list() را در منبع revisions فراخوانی کنید. این همه revisionIds موجود در فایل را برمی گرداند.

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

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

پارامتر alt=media URL یک پارامتر سیستمی است که در همه APIهای Google 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 است.

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

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

کد Enum توضیحات اقدام توصیه شده
1 CANCELLED این عملیات معمولاً توسط تماس گیرنده لغو شد. عملیات را دوباره اجرا کنید.
2 UNKNOWN این خطا ممکن است زمانی برگردانده شود که یک مقدار Status دریافت شده از فضای آدرس دیگری متعلق به فضای خطایی باشد که در این فضای آدرس شناخته شده نیست. اگر خطای API اطلاعات کافی را برنگرداند، ممکن است خطا به این خطا تبدیل شود. با عقب نشینی نمایی دوباره امتحان کنید.
3 INVALID_ARGUMENT مشتری یک آرگومان نامعتبر را مشخص کرده است. این خطا با FAILED_PRECONDITION متفاوت است. INVALID_ARGUMENT آرگومان هایی را نشان می دهد که بدون توجه به وضعیت سیستم مشکل ساز هستند، مانند نام فایل نادرست. بدون رفع مشکل دوباره امتحان نکنید.
4 DEADLINE_EXCEEDED مهلت قبل از تکمیل عملیات به پایان رسید. برای عملیاتی که وضعیت سیستم را تغییر می دهد، حتی اگر عملیات با موفقیت به پایان رسیده باشد، ممکن است این خطا برگردانده شود. به عنوان مثال، یک پاسخ موفقیت‌آمیز از یک سرور می‌توانست آنقدر به تأخیر بیفتد که مهلت آن به پایان برسد. با عقب نشینی نمایی دوباره امتحان کنید.
5 NOT_FOUND برخی از موجودیت های درخواست شده، مانند منبع FHIR، یافت نشد. بدون رفع مشکل دوباره تلاش نکنید.
6 ALREADY_EXISTS نهادی که مشتری سعی در ایجاد آن داشت، مانند نمونه DICOM، از قبل وجود دارد. بدون رفع مشکل دوباره تلاش نکنید.
7 PERMISSION_DENIED تماس گیرنده مجوز اجرای عملیات مشخص شده را ندارد. این کد خطا به این معنی نیست که درخواست معتبر است، موجودیت درخواستی وجود دارد، یا سایر پیش شرط ها را برآورده می کند. بدون رفع مشکل دوباره تلاش نکنید.
8 RESOURCE_EXHAUSTED برخی از منابع مانند سهمیه هر پروژه تمام شده است. با عقب نشینی نمایی دوباره امتحان کنید. سهمیه ممکن است به مرور زمان در دسترس باشد.
9 FAILED_PRECONDITION این عملیات رد شد زیرا سیستم در وضعیت لازم برای اجرای عملیات نیست. به عنوان مثال، دایرکتوری که باید حذف شود خالی نیست، یا عملیات rmdir روی یک غیر دایرکتوری اعمال می شود. بدون رفع مشکل دوباره تلاش نکنید.
10 ABORTED این عملیات معمولاً به دلیل یک مشکل همزمانی مانند شکست چک ترتیب‌دهنده یا لغو تراکنش متوقف شد. با عقب نشینی نمایی دوباره امتحان کنید.
11 OUT_OF_RANGE این عملیات از محدوده معتبر گذشته، مانند جستجو یا خواندن پایان فایل گذشته، انجام شد. برخلاف INVALID_ARGUMENT ، این خطا نشان دهنده مشکلی است که در صورت تغییر وضعیت سیستم ممکن است برطرف شود. بدون رفع مشکل دوباره تلاش نکنید.
12 UNIMPLEMENTED این عملیات اجرا نشده یا در Drive API پشتیبانی/فعال نشده است. دوباره امتحان نکن
13 INTERNAL خطاهای داخلی این نشان می دهد که یک خطای غیرمنتظره در پردازش در سیستم زیربنایی رخ داده است. با عقب نشینی نمایی دوباره امتحان کنید.
14 UNAVAILABLE Drive API در دسترس نیست. این به احتمال زیاد یک وضعیت گذرا است، که می توان با تلاش مجدد با عقب نشینی نمایی تصحیح کرد. توجه داشته باشید که همیشه امتحان مجدد عملیات های غیر توانمند ایمن نیست. با عقب نشینی نمایی دوباره امتحان کنید.
15 DATA_LOSS از دست دادن یا فساد غیرقابل جبران داده. با سرپرست سیستم خود تماس بگیرید. در صورت از دست دادن داده ها یا خرابی، ممکن است مدیر سیستم بخواهد با نماینده پشتیبانی تماس بگیرد.
16 UNAUTHENTICATED درخواست دارای اعتبارنامه اعتبارسنجی معتبر برای عملیات نیست. بدون رفع مشکل دوباره تلاش نکنید.