Tài liệu này trình bày một số kỹ thuật mà bạn có thể dùng để cải thiện hiệu suất của ứng dụng. Trong một số trường hợp, các ví dụ từ những API khác hoặc API chung sẽ được dùng để minh hoạ các ý tưởng được trình bày. Tuy nhiên, các khái niệm tương tự cũng áp dụng cho API Google Trang tính.
Nén bằng gzip
Một cách dễ dàng và thuận tiện để giảm băng thông cần thiết đối với mỗi yêu cầu là bật tính năng nén gzip. Mặc dù việc này đòi hỏi CPU mất thêm thời gian để giải nén kết quả, nhưng thường thì mức tiêu hao này cũng bù trừ với chi phí mạng.
Để nhận được phản hồi được mã hoá sau khi nén gzip, bạn phải thực hiện 2 thao tác: Thiết lập tiêu đề Accept-Encoding
và sửa đổi tác nhân người dùng để chứa chuỗi gzip
. Sau đây là ví dụ về các tiêu đề HTTP được định dạng đúng cách để bật tính năng nén gzip:
Accept-Encoding: gzip User-Agent: my program (gzip)
Thao tác với các tài nguyên một phần
Một cách khác để cải thiện hiệu suất của lệnh gọi API là chỉ yêu cầu phần dữ liệu mà bạn quan tâm. Điều này giúp ứng dụng của bạn tránh chuyển, phân tích cú pháp và lưu trữ các trường không cần thiết, nhờ đó ứng dụng có thể sử dụng các tài nguyên (bao gồm cả mạng, CPU và bộ nhớ) một cách hiệu quả hơn.
Phản hồi một phần
Theo mặc định, máy chủ sẽ gửi lại toàn bộ thông tin về một tài nguyên sau khi xử lý các yêu cầu. Để đạt hiệu suất tốt hơn, bạn có thể yêu cầu máy chủ chỉ gửi những trường mà bạn thực sự cần và nhận phản hồi một phần thay vì toàn bộ.
Để yêu cầu phản hồi một phần, hãy sử dụng tham số yêu cầu fields
để chỉ định các trường mà bạn muốn trả về. Bạn có thể dùng tham số này với mọi yêu cầu trả về dữ liệu phản hồi.
Ví dụ
Ví dụ sau đây minh hoạ cách sử dụng tham số fields
với một API "Demo" (giả định) chung.
Yêu cầu đơn giản: Yêu cầu HTTP GET
này bỏ qua tham số fields
và trả về toàn bộ tài nguyên.
https://www.googleapis.com/demo/v1
Phản hồi đầy đủ về tài nguyên: Dữ liệu đầy đủ về tài nguyên chứa các trường sau, cùng với nhiều trường khác đã bị bỏ qua để cho ngắn gọn.
{ "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", ... }, ... ] }
Yêu cầu phản hồi một phần: Yêu cầu sau đây đối với cùng một tài nguyên này sử dụng tham số fields
để giảm đáng kể lượng dữ liệu được trả về.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Phản hồi một phần: Để phản hồi yêu cầu ở trên, máy chủ sẽ gửi lại một phản hồi chỉ chứa thông tin về loại cùng với một mảng gồm nhiều mục đã được rút gọn, chỉ chứa thông tin về tiêu đề HTML và đặc điểm độ dài trong mỗi mục.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Xin lưu ý rằng phản hồi là một đối tượng JSON chỉ chứa các trường đã chọn và các đối tượng mẹ bao quanh.
Thông tin cụ thể về cách định dạng tham số fields
sẽ được trình bày trong phần kế tiếp, sau đó là thông tin chi tiết hơn về chính xác những nội dung được trả về trong phản hồi.
Tóm tắt cú pháp tham số trường
Định dạng của giá trị tham số yêu cầu fields
dựa trên cú pháp XPath. Cú pháp được hỗ trợ được tóm tắt dưới đây và các ví dụ khác sẽ được cung cấp trong phần sau.
- Sử dụng danh sách được phân tách bằng dấu phẩy để chọn nhiều trường.
- Sử dụng
a/b
để chọn một trườngb
được lồng trong trườnga
; sử dụnga/b/c
để chọn một trườngc
được lồng trongb
.
Trường hợp ngoại lệ: Đối với các phản hồi API sử dụng trình bao bọc "data", trong đó phản hồi được lồng trong một đối tượng
data
có dạngdata: { ... }
, đừng thêm "data
" vào quy cáchfields
. Việc đưa đối tượng dữ liệu vào cùng với một quy cách về trường nhưdata/a/b
sẽ gây ra lỗi. Thay vào đó, chỉ cần sử dụng một quy cáchfields
nhưa/b
. - Sử dụng bộ chọn phụ để yêu cầu một tập hợp trường phụ cụ thể của mảng hoặc đối tượng bằng cách đặt biểu thức trong dấu ngoặc đơn "
( )
".Ví dụ:
fields=items(id,author/email)
chỉ trả về mã mặt hàng và email của tác giả đối với từng phần tử trong mảng items. Bạn cũng có thể chỉ định một trường con duy nhất, trong đófields=items(id)
tương đương vớifields=items/id
. - Sử dụng ký tự đại diện trong quá trình lựa chọn trường (nếu cần).
Ví dụ:
fields=items/pagemap/*
chọn tất cả đối tượng trong một PageMap.
Các ví dụ khác về cách sử dụng tham số fields
Các ví dụ bên dưới sẽ mô tả cách giá trị tham số fields
ảnh hưởng đến phản hồi.
Lưu ý: Giống như tất cả giá trị tham số truy vấn, giá trị tham số fields
phải được mã hoá URL. Để dễ đọc hơn, các ví dụ trong tài liệu này sẽ bỏ qua quá trình mã hoá.
- Xác định các trường bạn muốn trả về hoặc thực hiện lựa chọn trường.
- Giá trị tham số yêu cầu
fields
là một danh sách gồm nhiều trường được phân tách bằng dấu phẩy và mỗi trường được chỉ định tương ứng với gốc của phản hồi. Do đó, nếu bạn đang thực hiện một thao tác list, thì phản hồi sẽ là một tập hợp và thường chứa một mảng tài nguyên. Nếu bạn đang thực hiện một thao tác trả về một tài nguyên duy nhất, các trường sẽ được chỉ định liên quan đến tài nguyên đó. Nếu trường bạn chọn là (hoặc là một phần của) một mảng, thì máy chủ sẽ trả về phần đã chọn của tất cả phần tử trong mảng.
Dưới đây là một số ví dụ ở cấp tập hợp:
Ví dụ Hiệu ứng items
Trả về tất cả phần tử trong mảng items, trong đó tất cả trường trong mỗi phần tử, nhưng không có trường nào khác. etag,items
Trả về cả trường etag
và tất cả phần tử trong mảng items.items/title
Chỉ trả về trường title
đối với tất cả phần tử trong mảng items.
Bất cứ khi nào một trường lồng nhau được trả về, phản hồi sẽ chứa các đối tượng mẹ bao quanh. Các trường mẹ không chứa bất cứ trường con nào khác, trừ phi các trường con đó cũng được chọn một cách rõ ràng.context/facets/label
Chỉ trả về trường label
đối với tất cả các thành viên của mảngfacets
. Mảng này được lồng trong đối tượngcontext
.items/pagemap/*/title
Đối với mỗi phần tử trong mảng items, chỉ trả về trường title
(nếu có) của tất cả đối tượng là phần tử con củapagemap
.
Dưới đây là một số ví dụ ở cấp tài nguyên:
Ví dụ Hiệu ứng title
Trả về trường title
của tài nguyên được yêu cầu.author/uri
Trả về trường phụ uri
của đối tượngauthor
trong tài nguyên được yêu cầu.links/*/href
Trả về trường href
của tất cả đối tượng là thành phần con củalinks
. - Chỉ yêu cầu các phần của những trường cụ thể bằng cách sử dụng lựa chọn phụ.
- Theo mặc định, nếu yêu cầu của bạn chỉ định các trường cụ thể, thì máy chủ sẽ trả về toàn bộ đối tượng hoặc phần tử mảng. Bạn có thể chỉ định một phản hồi chỉ chứa một số trường phụ nhất định. Bạn thực hiện việc này bằng cách sử dụng cú pháp chọn phụ "
( )
", như trong ví dụ bên dưới.Ví dụ Hiệu ứng items(title,author/uri)
Chỉ trả về các giá trị của title
vàuri
của tác giả đối với từng phần tử trong mảng items.
Xử lý phản hồi một phần
Sau khi xử lý một yêu cầu hợp lệ có chứa tham số truy vấn fields
, máy chủ sẽ gửi lại mã trạng thái HTTP 200 OK
, cùng với dữ liệu được yêu cầu. Nếu tham số truy vấn fields
có lỗi hoặc không hợp lệ, thì máy chủ sẽ trả về mã trạng thái HTTP 400 Bad Request
, cùng với một thông báo lỗi cho người dùng biết về vấn đề với trường mà họ chọn (ví dụ: "Invalid field selection a/b"
).
Sau đây là ví dụ về phản hồi một phần được trình bày trong phần giới thiệu ở trên. Yêu cầu này sử dụng tham số fields
để chỉ định những trường cần trả về.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Phản hồi một phần sẽ có dạng như sau:
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Lưu ý: Đối với những API hỗ trợ các tham số truy vấn để phân trang dữ liệu (ví dụ: maxResults
và nextPageToken
), hãy dùng các tham số đó để giảm số kết quả tương ứng với mỗi truy vấn xuống thành một lượng có thể quản lý. Nếu không, có thể bạn sẽ không nhận được mức tăng hiệu suất có khả năng đạt được khi dùng phản hồi một phần.