Thao tác chạy trong thời gian dài (LRO) là một phương thức API mất nhiều thời gian hơn để hoàn tất so với thời gian thích hợp cho một phản hồi API. Thông thường, bạn không nên giữ luồng gọi mở trong khi tác vụ chạy vì nó mang lại trải nghiệm người dùng kém. Thay vào đó, bạn nên trả về một số loại lời hứa cho người dùng và cho phép họ kiểm tra lại sau.
API Google Drive trả về một LRO mỗi khi bạn gọi phương thức download()
trên tài nguyên files
để tải nội dung của một tệp xuống thông qua API Drive hoặc thư viện ứng dụng của API đó.
Phương thức này trả về tài nguyên operations
cho ứng dụng khách. Bạn có thể sử dụng tài nguyên operations
để truy xuất trạng thái của phương thức API một cách không đồng bộ bằng cách thăm dò hoạt động thông qua phương thức get()
. LRO trong API Drive tuân thủ mẫu thiết kế LRO của Google Cloud.
Để biết thêm thông tin, hãy xem phần Thao tác chạy trong thời gian dài.
Tổng quan về quy trình
Sơ đồ sau đây cho thấy các bước cấp cao về cách hoạt động của phương thức file.download
.
Gọi
files.download
: Khi ứng dụng gọi phương thứcdownload()
, ứng dụng sẽ khởi chạy yêu cầu tải xuống API Drive cho tệp. Để biết thêm thông tin, hãy xem phần Tải tệp xuống.Yêu cầu cấp quyền: Yêu cầu này sẽ gửi thông tin xác thực đến API Drive. Nếu ứng dụng của bạn yêu cầu gọi API Drive bằng thông tin xác thực của người dùng chưa được cấp, thì ứng dụng sẽ nhắc người dùng đăng nhập. Ứng dụng của bạn cũng yêu cầu quyền truy cập với phạm vi mà bạn chỉ định khi thiết lập quy trình xác thực.
Bắt đầu tải xuống: Hệ thống sẽ tạo một yêu cầu API Drive để bắt đầu tải tệp xuống. Bạn có thể gửi yêu cầu này cho Google Vids hoặc một số nội dung khác trên Google Workspace.
Start LRO: Một thao tác chạy trong thời gian dài sẽ bắt đầu và quản lý quy trình tải xuống.
Trả về thao tác đang chờ xử lý: API Drive sẽ trả về một thao tác đang chờ xử lý chứa thông tin về việc người dùng đưa ra yêu cầu và một số trường siêu dữ liệu của tệp.
Trạng thái chờ xử lý ban đầu: Ứng dụng của bạn sẽ nhận được thao tác đang chờ xử lý cùng với trạng thái chờ xử lý ban đầu là
done=null
. Điều này cho biết tệp chưa sẵn sàng để tải xuống và trạng thái thao tác đang chờ xử lý.Gọi
operations.get
và xác minh kết quả: Ứng dụng của bạn gọiget()
theo các khoảng thời gian được đề xuất để thăm dò kết quả của thao tác và nhận trạng thái mới nhất của một thao tác chạy trong thời gian dài. Nếu trạng thái đang chờ xử lý củadone=false
được trả về, thì ứng dụng của bạn phải tiếp tục thăm dò ý kiến cho đến khi thao tác trả về trạng thái hoàn tất (done=true
). Đối với các tệp lớn, bạn có thể phải thăm dò ý kiến nhiều lần. Để biết thêm thông tin, hãy xem phần Nhận thông tin chi tiết về một hoạt động diễn ra trong thời gian dài.Kiểm tra trạng thái đang chờ xử lý: Nếu trạng thái đang chờ xử lý của
done=true
được trả về từ LRO, thì điều này cho biết tệp đã sẵn sàng để tải xuống và trạng thái thao tác đã hoàn tất.Trả về thao tác đã hoàn tất bằng URI tải xuống: Sau khi LRO hoàn tất, API Drive sẽ trả về URI tải xuống và người dùng hiện có thể truy cập vào tệp.
Tải tệp xuống
Để tải nội dung xuống trong một hoạt động diễn ra trong thời gian dài, hãy sử dụng phương thức download()
trên tài nguyên files
. Phương thức này lấy các thông số truy vấn của file_id
, mime_type
và revision_id
:
Bắt buộc. Tham số truy vấn
file_id
là mã nhận dạng của tệp cần tải xuống.Không bắt buộc. Tham số truy vấn
mime_type
biểu thị loại MIME mà phương thức sẽ sử dụng. Tính năng này chỉ hoạt động khi tải nội dung đa phương tiện không phải blob xuống (chẳng hạn như tài liệu Google Workspace). Để biết danh sách đầy đủ các loại MIME được hỗ trợ, hãy xem bài viết Xuất loại MIME cho tài liệu Google Workspace.Nếu bạn chưa đặt loại MIME, thì tài liệu trên Google Workspace sẽ được tải xuống bằng loại MIME mặc định. Để biết thêm thông tin, hãy xem phần Loại MIME mặc định.
Không bắt buộc. Tham số truy vấn
revision_id
là mã sửa đổi của tệp cần tải xuống. Bạn chỉ có thể sử dụng tính năng này khi tải các tệp blob, Google Tài liệu và Google Trang tính. Trả về mã lỗiINVALID_ARGUMENT
khi tải một bản sửa đổi cụ thể xuống trên các tệp không được hỗ trợ.
Phương thức download()
là cách duy nhất để tải tệp Vids xuống ở định dạng MP4 và thường phù hợp nhất để tải hầu hết tệp video xuống.
Ban đầu, các đường liên kết tải xuống được tạo cho Google Tài liệu hoặc Trang tính sẽ trả về lệnh chuyển hướng. Nhấp vào đường liên kết mới để tải tệp xuống.
Yêu cầu gửi đến phương thức download()
bắt đầu LRO và yêu cầu tìm nạp URI tải xuống cuối cùng đều phải sử dụng khoá tài nguyên. Để biết thêm thông tin, hãy xem bài viết Truy cập vào tệp trên Drive được chia sẻ bằng đường liên kết bằng khoá tài nguyên.
Giao thức yêu cầu sẽ hiển thị ở đây.
POST https://www.googleapis.com/drive/v3/files/{FILE_ID
}/download
Thay thế FILE_ID bằng fileId
của tệp bạn muốn tải xuống.
Loại MIME mặc định
Nếu bạn không đặt loại MIME khi tải nội dung không phải blob xuống, thì các loại MIME mặc định sau đây sẽ được chỉ định:
Loại tài liệu | Định dạng | Loại MIME | Đuôi tệp |
---|---|---|---|
Google Apps Script | JSON | ứng dụng/vnd.google-apps.script+json | .json |
Google Tài liệu | Microsoft Word | application/vnd.openxmlformats-officedocument.wordprocessingml.document | .docx |
Google Bản vẽ | PNG | hình ảnh/png | .png |
Google Biểu mẫu | Mã ZIP | ứng dụng/zip | .zip |
Google Trang tính | Microsoft Excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | .xlsx |
Google Sites | Văn bản thô | văn bản/thô | .txt |
Google Trang trình bày | Microsoft PowerPoint | ứng dụng/vnd.openxmlformats-officedocument.presentationml.presentations | .pptx |
Google Vids | MP4 | ứng dụng/mp4 | .mp4 |
Jamboard | ứng dụng/pdf |
Tải câu trả lời xuống
Khi gọi phương thức download()
, phần nội dung phản hồi bao gồm một tài nguyên đại diện cho một thao tác chạy trong thời gian dài. Phương thức này thường trả về một đường liên kết để tải nội dung tệp xuống.
{
"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
}
}
Kết quả này bao gồm các giá trị sau:
RESOURCE_KEY: Khoá tài nguyên giúp bảo vệ tệp của bạn khỏi truy cập ngoài ý muốn. Để biết thêm thông tin, hãy xem bài viết Truy cập vào các tệp trên Drive được chia sẻ đường liên kết bằng khoá tài nguyên.
NAME: Tên do máy chủ chỉ định.
DOWNLOAD_URI: URI tải xuống cuối cùng cho tệp.
Xin lưu ý rằng trường partialDownloadAllowed
cho biết liệu tải xuống một phần có được phép hay không.
Đúng khi tải nội dung tệp blob xuống.
Xem thông tin chi tiết về một thao tác chạy trong thời gian dài
Thao tác diễn ra trong thời gian dài là các lệnh gọi phương thức có thể mất một khoảng thời gian đáng kể để hoàn tất. Thông thường, các thao tác tải xuống mới tạo ban đầu sẽ được trả về ở trạng thái đang chờ xử lý (done=null
), đặc biệt là đối với các tệp Vids.
Bạn có thể sử dụng tài nguyên operations
mà API Drive cung cấp để kiểm tra trạng thái của LRO đang xử lý bằng cách thêm tên duy nhất do máy chủ chỉ định.
Phương thức get()
nhận trạng thái mới nhất của một thao tác chạy trong thời gian dài một cách không đồng bộ. Ứng dụng có thể sử dụng phương thức này để thăm dò kết quả thao tác theo các khoảng thời gian mà dịch vụ API đề xuất.
Thăm dò ý kiến về một thao tác chạy trong thời gian dài
Để thăm dò một LRO có sẵn, hãy gọi nhiều lần phương thức get()
cho đến khi thao tác kết thúc. Sử dụng thời gian đợi luỹ thừa giữa mỗi yêu cầu thăm dò ý kiến, chẳng hạn như 10 giây.
Một LRO vẫn tồn tại trong tối thiểu 12 giờ, nhưng trong một số trường hợp có thể tồn tại lâu hơn. Thời lượng này có thể thay đổi và có thể khác nhau giữa các loại tệp. Sau khi tài nguyên hết hạn, bạn cần thực hiện một yêu cầu phương thức download()
mới.
Mọi yêu cầu đến get()
đều phải sử dụng khoá tài nguyên. Để biết thêm thông tin, hãy xem phần Truy cập vào tệp trên Drive được chia sẻ bằng đường liên kết bằng khoá tài nguyên.
Các giao thức yêu cầu được hiển thị tại đây.
Lệnh gọi phương thức
operations.get(name='NAME');
Thay thế NAME bằng tên do máy chủ chỉ định cho thao tác như
hiển thị trong phản hồi cho yêu cầu phương thức download()
.
curl
curl -i -H \
'Authorization: Bearer $(gcloud auth print-access-token)" \
'https://googleapis.com/drive/v3/operations/NAME?alt=json'
Thay thế NAME bằng tên do máy chủ chỉ định cho thao tác như
hiển thị trong phản hồi cho yêu cầu phương thức download()
.
Lệnh này sử dụng đường dẫn /drive/v3/operations/NAME
.
Xin lưu ý rằng name
chỉ được trả về trong phản hồi cho yêu cầu download()
.
Không có cách nào khác để truy xuất tệp này vì API Drive không hỗ trợ phương thức
List()
. Nếu giá trị name
bị mất, bạn phải tạo một phản hồi mới bằng cách gọi lại yêu cầu phương thức download()
.
Phản hồi của yêu cầu get()
bao gồm một tài nguyên đại diện cho một thao tác diễn ra trong thời gian dài. Để biết thêm thông tin, hãy xem phần Tải phản hồi xuống.
Khi phản hồi chứa trạng thái hoàn tất (done=true
), thao tác chạy trong thời gian dài đã hoàn tất.
Tải bản sửa đổi xuống
Bạn có thể sử dụng giá trị của trường headRevisionId
từ tài nguyên files
để tải bản sửa đổi mới nhất xuống.
Thao tác này sẽ tìm nạp bản sửa đổi tương ứng với siêu dữ liệu của tệp mà bạn đã truy xuất trước đó. Để tải dữ liệu xuống cho tất cả các bản sửa đổi trước đó của tệp vẫn được lưu trữ trên đám mây, bạn có thể gọi phương thức list()
trên tài nguyên revisions
bằng tham số fileId
. Thao tác này sẽ trả về tất cả revisionIds
trong tệp.
Để tải nội dung bản sửa đổi của tệp blob, bạn phải gọi phương thức get()
trên tài nguyên revisions
kèm theo mã nhận dạng tệp cần tải xuống, mã nhận dạng của bản sửa đổi và tham số URL alt=media
.
Tham số URL alt=media
cho máy chủ biết rằng một yêu cầu tải nội dung xuống đang được yêu cầu dưới dạng định dạng phản hồi thay thế.
Bạn không thể tải bản sửa đổi cho Google Tài liệu, Trang tính, Trang trình bày và Vids xuống bằng phương thức get()
với URL alt=media
. Nếu không, lỗi fileNotDownloadable
sẽ được tạo.
Tham số URL alt=media
là một tham số hệ thống có sẵn trên tất cả các API REST của Google. Nếu sử dụng thư viện ứng dụng cho API Drive, bạn không cần phải đặt rõ ràng tham số này.
Giao thức yêu cầu được hiển thị tại đây.
GET https://www.googleapis.com/drive/v3/files/{FILE_ID
}/revisions/{REVISION_ID
}?alt=media
Thay thế nội dung sau:
- FILE_ID:
fileId
của tệp mà bạn muốn tải xuống. - REVISION_ID:
revisionId
của bản sửa đổi mà bạn muốn tải xuống.
Các bản sửa đổi của Google Tài liệu, Bản vẽ và Trang trình bày sẽ tự động tăng số bản sửa đổi. Tuy nhiên, dãy số này có thể có khoảng trống nếu các bản sửa đổi bị xoá, vì vậy, bạn không nên dựa vào các số tuần tự để truy xuất các bản sửa đổi.
Khắc phục sự cố LRO
Khi một LRO không thành công, phản hồi của LRO đó sẽ bao gồm một mã lỗi chính tắc của Google Cloud.
Bảng sau đây giải thích nguyên nhân của từng mã và đề xuất cách xử lý mã đó. Đối với nhiều lỗi, bạn nên thử thực hiện lại yêu cầu bằng cách sử dụng thuật toán thời gian đợi luỹ thừa.
Bạn có thể đọc thêm về mô hình lỗi này và cách xử lý trong Hướng dẫn thiết kế API.
Mã | Enum | Mô tả | Hành động được đề xuất |
---|---|---|---|
1 | CANCELLED |
Thao tác đã bị huỷ, thường là do phương thức gọi. | Chạy lại thao tác. |
2 | UNKNOWN |
Lỗi này có thể được trả về khi một giá trị Status nhận được từ một không gian địa chỉ khác thuộc về một không gian lỗi không xác định trong không gian địa chỉ này. Nếu lỗi API không trả về đủ thông tin, lỗi đó có thể được chuyển đổi thành lỗi này. |
Thử lại với thời gian đợi luỹ thừa. |
3 | INVALID_ARGUMENT |
Khách hàng đã chỉ định một đối số không hợp lệ. Lỗi này khác với FAILED_PRECONDITION . INVALID_ARGUMENT cho biết các đối số có vấn đề bất kể trạng thái của hệ thống, chẳng hạn như tên tệp không đúng định dạng. |
Đừng thử lại nếu bạn chưa khắc phục được vấn đề. |
4 | DEADLINE_EXCEEDED |
Thời hạn đã hết trước khi thao tác có thể hoàn tất. Đối với các thao tác thay đổi trạng thái của hệ thống, lỗi này có thể được trả về ngay cả khi thao tác đã hoàn tất thành công. Ví dụ: phản hồi thành công từ máy chủ có thể bị trì hoãn đủ lâu để thời hạn hết hạn. | Thử lại với thời gian đợi luỹ thừa. |
5 | NOT_FOUND |
Không tìm thấy một số thực thể được yêu cầu, chẳng hạn như tài nguyên FHIR. | Đừng thử lại nếu bạn chưa khắc phục được vấn đề. |
6 | ALREADY_EXISTS |
Thực thể mà ứng dụng khách tìm cách tạo, chẳng hạn như một thực thể DICOM, đã tồn tại. | Đừng thử lại nếu bạn chưa khắc phục được vấn đề. |
7 | PERMISSION_DENIED |
Phương thức gọi không có quyền thực thi thao tác đã chỉ định. Mã lỗi này không ngụ ý rằng yêu cầu là hợp lệ, thực thể được yêu cầu tồn tại hoặc đáp ứng các điều kiện tiên quyết khác. | Đừng thử lại khi chưa khắc phục vấn đề. |
8 | RESOURCE_EXHAUSTED |
Một số tài nguyên đã hết, chẳng hạn như hạn mức trên mỗi dự án. | Thử lại với thời gian đợi luỹ thừa. Định mức có thể được cung cấp theo thời gian. |
9 | FAILED_PRECONDITION |
Thao tác này bị từ chối vì hệ thống không ở trạng thái cần thiết để thực thi thao tác. Ví dụ: thư mục cần xoá không trống hoặc thao tác rmdir được áp dụng cho một thư mục không phải thư mục. |
Đừng thử lại khi chưa khắc phục vấn đề. |
10 | ABORTED |
Thao tác đã bị huỷ, thường là do vấn đề đồng thời như không kiểm tra được trình tự hoặc huỷ giao dịch. | Thử lại với thời gian đợi luỹ thừa. |
11 | OUT_OF_RANGE |
Thao tác đã được thực hiện ngoài phạm vi hợp lệ, chẳng hạn như tìm kiếm hoặc đọc ngoài cuối tệp. Không giống như INVALID_ARGUMENT , lỗi này cho biết một vấn đề có thể được khắc phục nếu trạng thái hệ thống thay đổi. |
Đừng thử lại nếu bạn chưa khắc phục được vấn đề. |
12 | UNIMPLEMENTED |
Thao tác này chưa được triển khai hoặc không được hỗ trợ/bật trong API Drive. | Không thử lại. |
13 | INTERNAL |
Lỗi nội bộ. Điều này chỉ ra rằng đã xảy ra lỗi không mong muốn trong quá trình xử lý trên hệ thống cơ bản. | Thử lại với thời gian đợi luỹ thừa. |
14 | UNAVAILABLE |
Không dùng được API Drive. Đây rất có thể là một tình trạng tạm thời, có thể khắc phục được bằng cách thử lại bằng thuật toán thời gian đợi luỹ thừa. Xin lưu ý rằng không phải lúc nào bạn cũng có thể thử lại các thao tác không idempotent một cách an toàn. | Thử lại với thời gian đợi luỹ thừa. |
15 | DATA_LOSS |
Dữ liệu bị mất hoặc không khôi phục được. | Hãy liên hệ với quản trị viên hệ thống của bạn. Quản trị viên hệ thống nên liên hệ với nhân viên hỗ trợ nếu dữ liệu bị mất hoặc bị hỏng. |
16 | UNAUTHENTICATED |
Yêu cầu không có thông tin xác thực hợp lệ cho thao tác. | Đừng thử lại khi chưa khắc phục vấn đề. |