Tài liệu này cho biết cách kết hợp các lệnh gọi API để giảm số lượng kết nối HTTP mà ứng dụng của bạn phải thực hiện.
Tài liệu này chủ yếu nói về việc tạo yêu cầu hàng loạt bằng cách gửi yêu cầu HTTP. Nếu bạn đang sử dụng thư viện ứng dụng của Google để tạo yêu cầu hàng loạt, hãy xem tài liệu về thư viện ứng dụng.
Tổng quan
Mỗi kết nối HTTP mà ứng dụng của bạn thực hiện sẽ dẫn đến một mức hao tổn nhất định. API Google Lớp học hỗ trợ tính năng tạo lô để cho phép ứng dụng của bạn đưa một số lệnh gọi API vào một yêu cầu HTTP.
Ví dụ về các trường hợp bạn nên sử dụng tính năng xử lý hàng loạt:
- Truy xuất danh sách lớp cho một số lượng lớn khoá học.
- Tạo hoặc cập nhật hàng loạt khoá học.
- Thêm một số lượng lớn danh sách lớp học.
- Truy xuất danh sách khoá học cho một số lượng lớn người dùng.
Trong mỗi trường hợp, thay vì gửi từng lệnh gọi riêng biệt, bạn có thể nhóm các lệnh gọi đó lại với nhau thành một yêu cầu HTTP duy nhất. Tất cả các yêu cầu bên trong phải chuyển đến cùng một API Google.
Bạn chỉ được gửi tối đa 50 lệnh gọi trong một yêu cầu hàng loạt. Nếu bạn phải thực hiện nhiều lệnh gọi hơn, hãy sử dụng nhiều yêu cầu theo lô.
Lưu ý: Hệ thống xử lý hàng loạt cho API Google Lớp học sử dụng cú pháp giống với hệ thống xử lý hàng loạt OData, nhưng ngữ nghĩa lại khác nhau.
Chi tiết gói
Yêu cầu hàng loạt bao gồm nhiều lệnh gọi API được kết hợp thành một yêu cầu HTTP. Yêu cầu này có thể được gửi đến batchPath
được chỉ định trong tài liệu khám phá API. Đường dẫn mặc định là /batch/api_name/api_version
. Phần này mô tả chi tiết cú pháp xử lý hàng loạt; sau đó, sẽ có một ví dụ.
Lưu ý: Một nhóm các yêu cầu n được gộp lại với nhau sẽ được tính vào hạn mức sử dụng dưới dạng các yêu cầu n, chứ không phải một yêu cầu. Yêu cầu theo lô được tách thành một nhóm yêu cầu trước khi xử lý.
Định dạng của yêu cầu theo lô
Yêu cầu theo lô là một yêu cầu HTTP chuẩn duy nhất chứa nhiều lệnh gọi API Google Lớp học, sử dụng loại nội dung multipart/mixed
. Trong yêu cầu HTTP chính đó, mỗi phần chứa một yêu cầu HTTP lồng nhau.
Mỗi phần bắt đầu bằng tiêu đề HTTP Content-Type: application/http
riêng. Tệp này cũng có thể có tiêu đề Content-ID
không bắt buộc. Tuy nhiên, tiêu đề phần chỉ dùng để đánh dấu phần bắt đầu; các tiêu đề này tách biệt với yêu cầu lồng nhau. Sau khi máy chủ mở gói yêu cầu hàng loạt thành các yêu cầu riêng biệt, các tiêu đề phần sẽ bị bỏ qua.
Nội dung của mỗi phần là một yêu cầu HTTP hoàn chỉnh, với động từ, URL, tiêu đề và nội dung riêng. Yêu cầu HTTP chỉ được chứa phần đường dẫn của URL; không được phép sử dụng URL đầy đủ trong yêu cầu hàng loạt.
Các tiêu đề HTTP cho yêu cầu hàng loạt bên ngoài, ngoại trừ các tiêu đề Content-
như Content-Type
, áp dụng cho mọi yêu cầu trong lô. Nếu bạn chỉ định một tiêu đề HTTP nhất định trong cả yêu cầu bên ngoài và một lệnh gọi riêng lẻ, thì giá trị của tiêu đề lệnh gọi riêng lẻ sẽ ghi đè giá trị của tiêu đề yêu cầu theo lô bên ngoài. Tiêu đề cho một lệnh gọi riêng lẻ chỉ áp dụng cho lệnh gọi đó.
Ví dụ: nếu bạn cung cấp tiêu đề Uỷ quyền cho một lệnh gọi cụ thể, thì tiêu đề đó chỉ áp dụng cho lệnh gọi đó. Nếu bạn cung cấp tiêu đề Uỷ quyền cho yêu cầu bên ngoài, thì tiêu đề đó sẽ áp dụng cho tất cả các lệnh gọi riêng lẻ, trừ phi các lệnh gọi đó ghi đè tiêu đề đó bằng tiêu đề Uỷ quyền của riêng chúng.
Khi nhận được yêu cầu theo lô, máy chủ sẽ áp dụng các tham số truy vấn và tiêu đề của yêu cầu bên ngoài (nếu thích hợp) cho từng phần, sau đó coi mỗi phần như một yêu cầu HTTP riêng biệt.
Phản hồi yêu cầu theo lô
Phản hồi của máy chủ là một phản hồi HTTP chuẩn duy nhất có loại nội dung multipart/mixed
; mỗi phần là phản hồi cho một trong các yêu cầu trong yêu cầu theo lô, theo thứ tự giống như các yêu cầu.
Giống như các phần trong yêu cầu, mỗi phần phản hồi chứa một phản hồi HTTP hoàn chỉnh, bao gồm mã trạng thái, tiêu đề và nội dung. Và giống như các phần trong yêu cầu, mỗi phần phản hồi đều có một tiêu đề Content-Type
ở phía trước để đánh dấu phần bắt đầu.
Nếu một phần nhất định của yêu cầu có tiêu đề Content-ID
, thì phần tương ứng của phản hồi sẽ có tiêu đề Content-ID
khớp, với giá trị ban đầu đứng trước chuỗi response-
, như trong ví dụ sau.
Lưu ý: Máy chủ có thể thực hiện các lệnh gọi của bạn theo thứ tự bất kỳ. Đừng tin rằng các lệnh này sẽ được thực thi theo thứ tự bạn chỉ định. Nếu muốn đảm bảo rằng hai lệnh gọi xảy ra theo thứ tự nhất định, bạn không thể gửi chúng trong một yêu cầu duy nhất; thay vào đó, hãy gửi lệnh gọi đầu tiên, sau đó đợi phản hồi cho lệnh gọi đầu tiên trước khi gửi lệnh gọi thứ hai.
Ví dụ:
Ví dụ sau đây cho thấy cách sử dụng tính năng xử lý hàng loạt bằng API Google Lớp học.
Ví dụ về yêu cầu theo lô
POST https://classroom.googleapis.com/batch HTTP/1.1 Authorization: Bearer your_auth_token Content-Type: multipart/mixed; boundary=batch_foobarbaz Content-Length: total_content_length --batch_foobarbaz Content-Type: application/http Content-Transfer-Encoding: binary MIME-Version: 1.0 Content-ID: <item1:12930812@classroom.example.com> PATCH /v1/courses/134529639?updateMask=name HTTP/1.1 Content-Type: application/json; charset=UTF-8 Authorization: Bearer your_auth_token { "name": "Course 1" } --batch_foobarbaz Content-Type: application/http Content-Transfer-Encoding: binary MIME-Version: 1.0 Content-ID: <item2:12930812@classroom.example.com> PATCH /v1/courses/134529901?updateMask=section HTTP/1.1 Content-Type: application/json; charset=UTF-8 Authorization: Bearer your_auth_token { "section": "Section 2" } --batch_foobarbaz--
Ví dụ về phản hồi hàng loạt
Đây là phản hồi cho yêu cầu mẫu trong phần trước.
HTTP/1.1 200 Content-Length: response_total_content_length Content-Type: multipart/mixed; boundary=batch_foobarbaz --batch_foobarbaz Content-Type: application/http Content-ID: <response-item1:12930812@classroom.example.com> HTTP/1.1 200 OK Content-Type application/json Content-Length: response_part_1_content_length { "id": "134529639", "name": "Course 1", "section": "Section 1", "ownerId": "116269102540619633451", "creationTime": "2015-06-25T14:23:56.535Z", "updateTime": "2015-06-25T14:33:06.583Z", "enrollmentCode": "6paeflo", "courseState": "PROVISIONED", "alternateLink": "http://classroom.google.com/c/MTM0NTI5NjM5" } --batch_foobarbaz Content-Type: application/http Content-ID: <response-item2:12930812@classroom.example.com> HTTP/1.1 200 OK Content-Type: application/json Content-Length: response_part_2_content_length { "id": "134529901", "name": "Course 1", "section": "Section 2", "ownerId": "116269102540619633451", "creationTime": "2015-06-25T14:23:08.761Z", "updateTime": "2015-06-25T14:33:06.490Z", "enrollmentCode": "so75ha5", "courseState": "PROVISIONED", "alternateLink": "http://classroom.google.com/c/MTM0NTI5OTAx" } --batch_foobarbaz--
Sử dụng thư viện ứng dụng
Các mã mẫu sau đây minh hoạ cách tạo yêu cầu hàng loạt bằng thư viện ứng dụng API của Google. Hãy xem hướng dẫn bắt đầu nhanh tương ứng để biết thêm thông tin về cách cài đặt và thiết lập các thư viện này.
.NET
Java
PHP
Python
course_id = '123456' student_emails = ['alice@example.edu', 'bob@example.edu'] def callback(request_id, response, exception): if exception is not None: print 'Error adding user "{0}" to the course course: {1}'.format( request_id, exception) else: print 'User "{0}" added as a student to the course.'.format( response.get('profile').get('name').get('fullName')) batch = service.new_batch_http_request(callback=callback) for student_email in student_emails: student = { 'userId': student_email } request = service.courses().students().create(courseId=course_id, body=student) batch.add(request, request_id=student_email) batch.execute(http=http)