Cải thiện hiệu suất

Tài liệu này bao gồm một số kỹ thuật mà bạn có thể sử dụng để cải thiện hiệu suất của ứng dụng. Trong một số trường hợp, ví dụ từ các API khác hoặc các API chung được dùng để minh hoạ các ý tưởng đã trình bày. Tuy nhiên, các khái niệm tương tự có thể áp dụng cho API Báo cáo trải nghiệm quảng cáo của Google.

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 cho mỗi yêu cầu là bật tính năng nén gzip. Mặc dù điều này đòi hỏi thêm thời gian của CPU để giải nén kết quả, nhưng sự đánh đổi với chi phí mạng thường rất đáng giá.

Để nhận phản hồi được mã hoá gzip, bạn phải thực hiện hai việc: Đặt tiêu đề Accept-Encoding và sửa đổi tác nhân người dùng để chứa chuỗi gzip. Dưới đây là ví dụ về tiêu đề HTTP có định dạng hợp lệ để bật tính năng nén gzip:

Accept-Encoding: gzip
User-Agent: my program (gzip)

Làm việc với một phần tài nguyên

Một cách khác để cải thiện hiệu suất cho các 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 cho phé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, để ứng dụng có thể sử dụng tài nguyên bao gồm mạng, CPU và bộ nhớ 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 bản trình bày đầy đủ của một tài nguyên sau khi xử lý yêu cầu. Để cải thiện hiệu suất, 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.

Để yêu cầu phản hồi một phần, hãy 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 bất kỳ yêu cầu nào trả về dữ liệu phản hồi.

Ví dụ:

Ví dụ sau cho thấy việc sử dụng tham số fields với API chung (hư cấu) "demo".

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 đủ tài nguyên: Dữ liệu tài nguyên đầy đủ bao gồm 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 cho cùng một tài nguyên này sử dụng thông 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ủ gửi lại một phản hồi chỉ chứa thông tin loại cùng với một mảng mục được rút gọn chỉ bao gồm thông tin đặc điểm tiêu đề và độ dài HTML 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ỉ bao gồm các trường đã chọn và các đối tượng mẹ xung quanh.

Tiếp theo, chúng tôi sẽ trình bày chi tiết về cách định dạng thông số fields, sau đó là thông tin chi tiết hơn về chính xác nội dung được trả về trong phản hồi.

Tóm tắt cú pháp thông số các trường

Định dạng của giá trị tham số yêu cầu fields được dựa trên cú pháp XPath được thả lỏng. Cú pháp được hỗ trợ được tóm tắt như dưới đây và các ví dụ khác đượ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 trường b lồng trong trường a; sử dụng a/b/c để chọn trường c lồng trong b.

    Ngoại lệ: Đối với các phản hồi API sử dụng "data" trình bao bọc, trong đó phản hồi được lồng trong một đối tượng data trông giống data: { ... }, không bao gồm "data" trong thông số kỹ thuật fields. Việc cung cấp đối tượng dữ liệu có thông số trường như data/a/b sẽ gây ra lỗi. Thay vào đó, bạn chỉ cần sử dụng một thông số kỹ thuật của fields như a/b.

  • Hãy sử dụng bộ chọn phụ để yêu cầu một tập hợp các trường con 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ả cho từng thành phần trong mảng mặt hàng. Bạn cũng có thể chỉ định một trường con, trong đó fields=items(id) tương đương với fields=items/id.

  • Sử dụng ký tự đại diện trong các lựa chọn trường, nếu cần.

    Ví dụ: fields=items/pagemap/* chọn tất cả đối tượng trong sơ đồ trang.

Các ví dụ khác về việc sử dụng thông số trường

Các ví dụ bên dưới bao gồm thông tin mô tả về tác động của giá trị thông số fields đối với 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ã hóa URL. Để dễ đọc hơn, các ví dụ trong tài liệu này bỏ qua phần mã hoá.

Xác định các trường bạn muốn trả về hoặc chọn trường được chọn.
Giá trị tham số yêu cầu fields là danh sách các 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 thư mục gốc của phản hồi. Do đó, nếu bạn đang thực hiện một thao tác danh sách, thì phản hồi là một tập hợp và thường bao gồm 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, thì các trường sẽ được chỉ định tương ứng với 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, máy chủ sẽ trả về phần được chọn của tất cả các thành phần trong mảng.

Dưới đây là một số ví dụ ở cấp độ bộ sưu tập:
Ví dụ Hiệu quả
items Trả về tất cả các thành phần trong mảng items, bao gồm tất cả các trường trong mỗi thành phần, nhưng không trả về trường nào khác.
etag,items Trả về cả trường etag và mọi thành phần trong mảng items.
items/title Chỉ trả về trường title cho tất cả các phần tử trong mảng items.

Mỗi khi một trường lồng nhau được trả về, phản hồi sẽ bao gồm các đối tượng mẹ xung quanh. Các trường chính không bao gồm các trường con khác trừ khi được chọn rõ ràng.
context/facets/label Chỉ trả về trường label cho tất cả thành viên của mảng facets. Thuộc tính này được lồng trong đối tượng context.
items/pagemap/*/title Đối với mỗi phần tử trong mảng mặt hàng, chỉ trả về trường title (nếu có) của tất cả các đối tượng là phần tử con của pagemap.

Dưới đây là một số ví dụ ở cấp tài nguyên:
Ví dụ Hiệu quả
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ượng author 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à phần tử con của links.
Chỉ yêu cầu các phần của một số 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 câu trả lời chỉ bao gồm một số trường con. Bạn thực hiện việc này bằng cách sử dụng "( )" cú pháp lựa chọn phụ, như trong ví dụ bên dưới.
Ví dụ: Hiệu quả
items(title,author/uri) Chỉ trả về các giá trị của titleuri của tác giả cho từng phần tử trong mảng items.

Xử lý một phần phản hồi

Sau khi xử lý một yêu cầu hợp lệ bao gồm 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ệ, máy chủ sẽ trả về mã trạng thái HTTP 400 Bad Request, cùng với thông báo lỗi cho người dùng biết điều gì đang xảy ra với lựa chọn trường của họ (ví dụ: "Invalid field selection a/b").

Đây là ví dụ về phản hồi một phần trong phần giới thiệu ở trên. Yêu cầu này sử dụng thông số fields để chỉ định 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 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 các API hỗ trợ các tham số truy vấn để phân trang dữ liệu (ví dụ: maxResultsnextPageToken), hãy sử dụng các tham số đó để giảm kết quả của mỗi truy vấn xuống kích thước có thể quản lý được. Nếu không, hiệu suất có thể đạt được nếu phản hồi một phần có thể không được ghi nhận.