Tài liệu tham khảo về giao thức API dữ liệu của Google

Tài liệu này mô tả giao thức mà API dữ liệu của Google sử dụng, bao gồm thông tin về truy vấn, hình thức của kết quả, v.v.

Để biết thêm thông tin về API Dữ liệu của Google, hãy xem tài liệu Hướng dẫn dành cho nhà phát triển dữ liệu của GoogleHướng dẫn về giao thức.

Đối tượng người xem

Tài liệu này dành cho những ai muốn tìm hiểu chi tiết về định dạng XML và giao thức mà API Dữ liệu Google sử dụng.

Nếu chỉ muốn viết mã sử dụng API ứng dụng dữ liệu của Google, thì bạn không cần biết những chi tiết này; thay vào đó, bạn có thể sử dụng thư viện ứng dụng dành riêng cho ngôn ngữ.

Nhưng nếu bạn muốn hiểu giao thức, hãy đọc tài liệu này. Ví dụ: bạn có thể muốn đọc tài liệu này để giúp bạn thực hiện bất kỳ tác vụ nào sau đây:

  • đánh giá cấu trúc Dữ liệu của Google
  • lập trình bằng giao thức mà không cần sử dụng thư viện ứng dụng Google Data được cung cấp
  • viết thư viện ứng dụng bằng ngôn ngữ mới

Tài liệu này giả định rằng bạn hiểu được các khái niệm cơ bản về XML, vùng chứa tên, nguồn cấp dữ liệu được phân phối và các yêu cầu GET, POST, PUTDELETE trong HTTP, cũng như khái niệm "tài nguyên" của HTTP. Để biết thêm thông tin về những vấn đề đó, hãy xem phần Tài nguyên bổ sung của tài liệu này.

Tài liệu này không dựa vào bất kỳ ngôn ngữ lập trình cụ thể nào. Bạn có thể gửi và nhận thông báo Dữ liệu của Google bằng cách sử dụng bất kỳ ngôn ngữ lập trình nào cho phép bạn đưa ra yêu cầu HTTP và phân tích cú pháp phản hồi dựa trên XML.

Chi tiết về giao thức

Phần này mô tả định dạng tài liệu và cú pháp truy vấn của dữ liệu trên Google.

Định dạng tài liệu

Dữ liệu của Google, Atom và RSS 2.0 đều có cùng một mô hình dữ liệu cơ bản: một vùng chứa lưu giữ cả một số dữ liệu toàn cầu và số lượng mục nhập bất kỳ. Đối với mỗi giao thức, định dạng được xác định bởi một giản đồ cơ sở, nhưng có thể mở rộng định dạng này bằng cách sử dụng không gian tên nước ngoài.

API Dữ liệu của Google có thể sử dụng định dạng phân phối Atom (đối với cả lượt đọc và lượt ghi) hoặc định dạng RSS (chỉ dành cho lượt đọc).

Atom là định dạng mặc định của Google Data. Để yêu cầu phản hồi ở định dạng RSS, hãy sử dụng tham số /alt=rss/; để biết thêm thông tin, hãy xem phần Yêu cầu truy vấn.

Khi bạn yêu cầu dữ liệu ở định dạng RSS, Google Data sẽ cung cấp nguồn cấp dữ liệu (hoặc đại diện khác cho tài nguyên) ở định dạng RSS. Nếu không có thuộc tính RSS tương đương cho một thuộc tính Google Data nhất định, thì Dữ liệu của Google sẽ sử dụng thuộc tính Atom, gắn nhãn bằng một vùng chứa tên thích hợp để cho biết đó là phần mở rộng cho RSS.

Lưu ý: Hầu hết nguồn cấp dữ liệu của Google ở định dạng Atom đều sử dụng vùng chứa tên Atom làm không gian tên mặc định bằng cách chỉ định thuộc tính xmlns trên phần tử nguồn cấp dữ liệu. Xem phần ví dụ để biết cách thực hiện. Do đó, những ví dụ trong tài liệu này không chỉ định rõ ràng atom: cho các phần tử trong nguồn cấp dữ liệu định dạng Atom.

Các bảng sau đây trình bày các đại diện Atom và RSS cho các thành phần của giản đồ. Tất cả dữ liệu không được đề cập trong những bảng này đều được coi là XML thuần tuý và hiển thị giống nhau trong cả hai đại diện. Trừ phi có quy định khác, các phần tử XML trong một cột nhất định nằm trong không gian tên tương ứng với cột đó. Bản tóm tắt này sử dụng ký hiệu JavaScript tiêu chuẩn: cụ thể là các dấu gạch chéo cho biết hệ thống phân cấp phần tử và dấu @ cho biết một thuộc tính của phần tử.

Trong mỗi bảng sau, bạn cần điền các mục được làm nổi bật.

Bảng sau đây cho thấy các thành phần của một Nguồn cấp dữ liệu của Google:

Mục giản đồ nguồn cấp dữ liệu Đại diện nguyên tử Phần trình bày RSS
Tiêu đề của nguồn cấp dữ liệu /feed/title /rss/channel/title
ID nguồn cấp dữ liệu /feed/id /rss/channel/atom:id
Đường liên kết HTML của nguồn cấp dữ liệu /feed/link[@rel="alternate"] [@type="text/html"]/@href
/rss/channel/link
Mô tả nguồn cấp dữ liệu /feed/subtitle /rss/channel/description
Ngôn ngữ của nguồn cấp dữ liệu /feed/@xml:lang /rss/channel/language
Bản quyền trên nguồn cấp dữ liệu /feed/rights /rss/channel/copyright
Tác giả của nguồn cấp dữ liệu

/feed/author/name
/feed/author/email

(Bắt buộc trong một số trường hợp; xem thông số kỹ thuật Atom.)

/rss/channel/managingEditor
Ngày cập nhật nguồn cấp dữ liệu gần đây nhất /feed/updated
(Định dạng RFC 3339)
/rss/channel/lastBuildDate
(Định dạng RFC 822)
Danh mục nguồn cấp dữ liệu /feed/category/@term /rss/channel/category
Lược đồ danh mục nguồn cấp dữ liệu /feed/category/@scheme /rss/channel/category/@domain
Trình tạo nguồn cấp dữ liệu /feed/generator
/feed/generator/@uri
/rss/channel/generator
Biểu tượng nguồn cấp dữ liệu /feed/icon /rss/channel/image/url (trừ trường hợp còn có biểu trưng, trong trường hợp này, biểu tượng không có trong nguồn cấp dữ liệu)
Biểu tượng của nguồn cấp dữ liệu /feed/logo /rss/channel/image/url

Bảng sau trình bày các thành phần của nguồn cấp dữ liệu kết quả tìm kiếm trên Google Data. Lưu ý rằng Dữ liệu trên Google sẽ hiển thị một số phần tử Phản hồi của OpenSearch 1.1 trong nguồn cấp dữ liệu về kết quả tìm kiếm.

Mục lược đồ nguồn cấp dữ liệu kết quả tìm kiếm Đại diện nguyên tử Nội dung đại diện RSS/OpenSearch
Số lượng kết quả tìm kiếm /feed/openSearch:totalResults /rss/channel/openSearch:totalResults
Chỉ mục bắt đầu kết quả tìm kiếm /feed/openSearch:startIndex /rss/channel/openSearch:startIndex
Số kết quả tìm kiếm trên mỗi trang /feed/openSearch:itemsPerPage /rss/channel/openSearch:itemsPerPage

Bảng sau đây cho thấy các thành phần của một mục dữ liệu trên Google:

Mục giản đồ mục nhập Đại diện nguyên tử Phần trình bày RSS
Mã mục nhập /feed/entry/id /rss/channel/item/guid
Mã phiên bản mục nhập Tùy chọn được nhúng trong EditURI (xem phần Đồng thời tối ưu của tài liệu này).
Tiêu đề mục nhập /feed/entry/title /rss/channel/item/title
Đường liên kết đến mục nhập /feed/entry/link /rss/channel/item/link
/rss/channel/item/enclosure
/rss/channel/item/comments
Tóm tắt thông tin đăng ký

/feed/entry/summary

(Bắt buộc trong một số trường hợp; xem thông số kỹ thuật Atom.)

/rss/channel/item/atom:summary
Nội dung nhập

/feed/entry/content

(Nếu không có phần tử nội dung nào thì mục nhập phải chứa ít nhất một phần tử <link rel="alternate">.)

/rss/channel/item/description
Tác giả nhập môn

/feed/entry/author/name
/feed/entry/author/email

(Bắt buộc trong một số trường hợp; xem thông số kỹ thuật Atom.)

/rss/channel/item/author
Danh mục nhập /feed/entry/category/@term /rss/channel/item/category
Lược đồ danh mục mục nhập /feed/entry/category/@scheme /rss/channel/item/category/@domain
Ngày phát hành mục /feed/entry/published
(RFC 3339)
/rss/channel/item/pubDate
(RFC 822)
Ngày cập nhật mục nhập /feed/entry/updated
(RFC 3339)
/rss/channel/item/atom:updated
(RFC 3339)

Cụm từ tìm kiếm

Phần này mô tả cách sử dụng hệ thống truy vấn.

Nguyên lý thiết kế mô hình truy vấn

Mô hình truy vấn có chủ ý rất đơn giản. Nguyên tắc cơ bản là:

  • Các truy vấn được biểu thị dưới dạng URI HTTP, chứ không phải là tiêu đề HTTP hoặc như một phần của trọng tải. Một lợi ích của phương pháp này là bạn có thể liên kết với truy vấn.
  • Các thuộc tính nằm trong phạm vi một mục. Vì vậy, không có cách nào để gửi một cụm từ tìm kiếm tương quan như "tìm tất cả email từ những người đã gửi cho tôi ít nhất 10 email trong hôm nay".
  • Tập hợp các thuộc tính mà truy vấn có thể dự đoán rất hạn chế; hầu hết các truy vấn chỉ đơn giản là truy vấn tìm kiếm văn bản đầy đủ.
  • Thứ tự kết quả phụ thuộc vào việc triển khai.
  • Giao thức này có thể mở rộng tự nhiên. Nếu muốn hiển thị các thuộc tính hoặc sắp xếp bổ sung trong dịch vụ, bạn có thể dễ dàng thực hiện thông qua việc giới thiệu các tham số mới.

Yêu cầu truy vấn

Một ứng dụng truy vấn dịch vụ Dữ liệu của Google bằng cách gửi một yêu cầu HTTP GET. URI truy vấn bao gồm URI của tài nguyên (được gọi là FeedURI trong Atom) sau đó là tham số truy vấn. Hầu hết các tham số truy vấn được biểu thị dưới dạng tham số URL ?name=value[&...] truyền thống. Thông số danh mục được xử lý khác nhau; hãy xem bên dưới.

Ví dụ: nếu URI URI là http://www.example.com/feeds/jo, thì bạn có thể gửi truy vấn với URI sau:

http://www.example.com/feeds/jo?q=Darcy&updated-min=2005-04-19T15:30:00Z

Dịch vụ dữ liệu của Google hỗ trợ HTTP có điều kiện GET. Họ đặt tiêu đề phản hồi Sửa đổi lần cuối dựa trên giá trị của phần tử <atom:updated> trong nguồn cấp dữ liệu hoặc mục nhập được trả về. Một ứng dụng có thể gửi lại giá trị này dưới dạng giá trị của tiêu đề yêu cầu If-Sửa đổi-Từ để tránh truy xuất lại nội dung nếu nội dung đó chưa thay đổi. Nếu nội dung không thay đổi kể từ thời gian If-Sửa đổi từ thì dịch vụ Dữ liệu của Google sẽ trả về phản hồi HTTP 304 (Không sửa đổi).

Dịch vụ dữ liệu của Google phải hỗ trợ các truy vấn danh mục và truy vấn alt; không bắt buộc phải hỗ trợ các tham số khác. Việc chuyển một thông số chuẩn không được dịch vụ nhất định hiểu được sẽ dẫn đến một phản hồi 403 Forbidden. Truyền một tham số không chuẩn không được hỗ trợ sẽ dẫn đến một phản hồi 400 Bad Request. Để biết thông tin về các mã trạng thái khác, hãy xem phần Mã trạng thái HTTP của tài liệu này.

Các tham số truy vấn chuẩn được tóm tắt trong bảng sau. Tất cả giá trị thông số cần phải được mã hóa URL.

Thông số Ý nghĩa Ghi chú
q Chuỗi truy vấn văn bản đầy đủ
  • Khi tạo truy vấn, hãy liệt kê các cụm từ tìm kiếm được phân tách bằng dấu cách, dưới dạng q=term1 term2 term3. (Tương tự như tất cả các giá trị tham số truy vấn, không gian phải được mã hoá URL.) Dịch vụ dữ liệu của Google trả về tất cả mục nhập khớp với tất cả cụm từ tìm kiếm (như sử dụng AND giữa các cụm từ). Giống như tìm kiếm trên web của Google, dịch vụ dữ liệu của Google tìm kiếm các từ hoàn chỉnh (và các từ có liên quan đến cùng một gốc), chứ không phải chuỗi con.
  • Để tìm kiếm một cụm từ chính xác, hãy đặt cụm từ đó trong dấu ngoặc kép: q="exact phrase".
  • Để loại trừ các mục nhập khớp với một cụm từ nhất định, hãy sử dụng biểu mẫu q=-term.
  • Nội dung tìm kiếm không phân biệt chữ hoa chữ thường.
  • Ví dụ: để tìm kiếm tất cả các mục có chứa cụm từ chính xác "Elizabeth Bennet" và từ "Darcy" nhưng không chứa từ "Austen", hãy sử dụng truy vấn sau: ?q="Elizabeth Bennet" Darcy -Austen
/-/category Bộ lọc danh mục
  • Liệt kê từng danh mục như thể nó nằm trong URI của tài nguyên, ở dạng /categoryname/—đây là một ngoại lệ đối với biểu mẫu name=value thông thường.
  • Liệt kê tất cả các danh mục trước những thông số truy vấn khác.
  • Đặt trước danh mục đầu tiên bằng /-/ để làm rõ rằng đây là danh mục. Ví dụ: Nếu nguồn cấp dữ liệu của Jo có một danh mục cho các mục về Fritz, thì bạn có thể yêu cầu các mục đó như sau: http://www.example.com/feeds/jo/-/Fritz. Điều này cho phép triển khai để phân biệt URI truy vấn phân loại với URI tài nguyên.
  • Bạn có thể truy vấn trên nhiều danh mục bằng cách liệt kê nhiều tham số danh mục, phân tách bằng dấu gạch chéo. Dịch vụ dữ liệu của Google trả về tất cả mục nhập khớp với tất cả các danh mục (như sử dụng AND giữa các cụm từ). Ví dụ: http://www.example.com/feeds/jo/-/Fritz/Laurie trả về các mục khớp với cả hai danh mục.
  • Để tạo OR giữa các cụm từ, hãy sử dụng ký tự dấu gạch đứng (|), được mã hóa URL dưới dạng %7C. Ví dụ: http://www.example.com/feeds/jo/-/Fritz%7CLaurie trả về các mục khớp với một trong hai danh mục.
  • Mục nhập khớp với danh mục được chỉ định nếu mục nhập đó nằm trong danh mục có cụm từ hoặc nhãn phù hợp, như được xác định trong thông số kỹ thuật Atom. (Nói chung, "từ khoá" là chuỗi nội bộ mà phần mềm dùng để xác định danh mục, còn "label" là chuỗi mà người dùng có thể đọc được hiển thị trong giao diện người dùng.)
  • Để loại trừ các mục nhập phù hợp với một danh mục nhất định, hãy sử dụng biểu mẫu /-categoryname/.
  • Để truy vấn một danh mục có lược đồ – chẳng hạn như <category scheme="urn:google.com" term="public"/> – bạn phải đặt lược đồ đó trong dấu ngoặc nhọn trước tên danh mục. Ví dụ: /{urn:google.com}public. Nếu lược đồ chứa ký tự dấu gạch chéo (/), mã đó phải được mã hoá URL là %2F. Để khớp với danh mục không có lược đồ, hãy sử dụng một cặp dấu ngoặc nhọn trống. Nếu bạn không chỉ định dấu ngoặc nhọn, thì danh mục trong mọi lược đồ sẽ khớp.
  • Bạn có thể kết hợp các tính năng trên với nhau. Ví dụ: /A%7C-{urn:google.com}B/-C có nghĩa là (A OR (NOT B)) AND (NOT C).
category Bộ lọc danh mục
  • Một cách khác để thực hiện bộ lọc danh mục. Hai phương thức này tương đương nhau.
  • Để tạo OR giữa các cụm từ, hãy sử dụng ký tự dấu gạch đứng (|), được mã hóa URL dưới dạng %7C. Ví dụ: http://www.example.com/feeds?category=Fritz%7CLaurie trả về các mục khớp với một trong hai danh mục.
  • Để AND giữa các cụm từ, hãy sử dụng ký tự dấu phẩy (,). Ví dụ: http://www.example.com/feeds?category=Fritz,Laurie trả về các mục khớp với cả hai danh mục.
author Tác giả nhập môn
  • Dịch vụ này trả về các mục mà tên tác giả và/hoặc địa chỉ email khớp với chuỗi truy vấn của bạn.
alt Loại hình đại diện thay thế
  • Nếu bạn không chỉ định tham số alt, dịch vụ sẽ trả về một nguồn cấp dữ liệu Atom. Giá trị này tương đương với alt=atom.
  • alt=rss trả về nguồn cấp dữ liệu kết quả RSS 2.0.
  • alt=json trả về một bản trình bày JSON của nguồn cấp dữ liệu. Thêm thông tin
  • alt=json-in-script Yêu cầu phản hồi bao bọc JSON trong một thẻ tập lệnh. Thêm thông tin
updated-min, updated-max Ranh giới vào ngày cập nhật mục nhập
  • Hãy dùng định dạng dấu thời gian RFC 3339. Ví dụ: 2005-08-09T10:57:00-08:00.
  • Giới hạn dưới được bao gồm, trong khi giới hạn trên không bao gồm.
published-min, published-max Ranh giới vào ngày xuất bản mục
  • Hãy dùng định dạng dấu thời gian RFC 3339. Ví dụ: 2005-08-09T10:57:00-08:00.
  • Giới hạn dưới được bao gồm, trong khi giới hạn trên không bao gồm.
start-index 1 chỉ mục dựa trên kết quả đầu tiên được truy xuất
  • Lưu ý rằng đây không phải là cơ chế di chuyển chung. Nếu trước tiên bạn gửi một truy vấn bằng ?start-index=1&max-results=10 rồi gửi một truy vấn khác bằng ?start-index=11&max-results=10, thì dịch vụ này không thể đảm bảo rằng các kết quả này tương đương với ?start-index=1&max-results=20, vì có thể đã xảy ra việc chèn và xoá dữ liệu giữa hai truy vấn.
max-results Số lượng kết quả truy xuất tối đa Đối với dịch vụ có giá trị max-results mặc định (để giới hạn kích thước nguồn cấp dữ liệu mặc định), bạn có thể chỉ định một số rất lớn nếu muốn nhận toàn bộ nguồn cấp dữ liệu.
entryID Mã của một mục cụ thể sẽ được truy xuất
  • Nếu chỉ định một mã mục nhập, thì bạn sẽ không thể chỉ định bất kỳ tham số nào khác.
  • Dịch vụ Dữ liệu của Google sẽ xác định biểu mẫu của mã mục nhập.
  • Không giống như hầu hết các thông số truy vấn khác, mã mục nhập được chỉ định dưới dạng một phần của URI, không phải dưới dạng một cặp name=value.
  • Ví dụ: http://www.example.com/feeds/jo/entry1

Giới thiệu về truy vấn danh mục

Chúng tôi quyết định chỉ định một định dạng không bình thường cho các truy vấn danh mục. Thay vì một truy vấn như sau:

http://example.com/jo?category=Fritz&category=2006

chúng tôi sử dụng:

http://example.com/jo/-/Fritz/2006

Phương pháp này xác định một tài nguyên không cần sử dụng tham số truy vấn và tạo ra URI sạch hơn. Chúng tôi chọn phương pháp này cho danh mục vì chúng tôi nghĩ rằng truy vấn danh mục sẽ là truy vấn phổ biến nhất.

Hạn chế của phương pháp này là chúng tôi yêu cầu bạn sử dụng /-/ trong truy vấn danh mục để dịch vụ dữ liệu của Google có thể phân biệt truy vấn danh mục với URI tài nguyên khác, chẳng hạn như http://example.com/jo/MyPost/comments.

Câu trả lời cho cụm từ tìm kiếm

Các truy vấn trả về nguồn cấp dữ liệu Atom, mục nhập Atom hoặc nguồn cấp dữ liệu RSS, tuỳ thuộc vào thông số yêu cầu.

Kết quả truy vấn chứa các phần tử OpenSearch sau đây ngay trong phần tử <feed> hoặc phần tử <channel> (tuỳ thuộc vào việc kết quả là Atom hay RSS):

openSearch:totalResults
Tổng số kết quả tìm kiếm cho cụm từ tìm kiếm (không nhất thiết phải có tất cả kết quả trong nguồn cấp dữ liệu về kết quả).
openSearch:startIndex
Chỉ mục dựa trên 1 của kết quả đầu tiên.
openSearch:itemsPerPage
Số lượng mục tối đa xuất hiện trên một trang. Điều này cho phép khách hàng tạo các đường liên kết trực tiếp đến mọi nhóm trang tiếp theo. Tuy nhiên, nếu sử dụng số điện thoại này có sai lầm có thể xảy ra, hãy xem lưu ý về start-index trong bảng trong phần Yêu cầu truy vấn.

Nguồn cấp dữ liệu phản hồi và mục nhập Atom cũng có thể bao gồm mọi phần tử Atom và Google Data sau đây (cũng như các phần tử khác đã liệt kê trong quy cách Atom):

<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="..."/>
Chỉ định URI nơi có thể truy xuất nguồn cấp dữ liệu Atom hoàn chỉnh.
<link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="..."/>
Chỉ định URI URI của nguồn cấp dữ liệu Atom (nơi có thể đăng các mục nhập mới).
<link rel="self" type="..." href="..."/>
Chứa URI của tài nguyên này. Giá trị của thuộc tính type phụ thuộc vào định dạng đã yêu cầu. Nếu không có dữ liệu thay đổi trong thời gian chờ đợi, việc gửi một GET khác đến URI này sẽ trả về cùng một phản hồi.
<link rel="previous" type="application/atom+xml" href="..."/>
Chỉ định URI của phần trước của tập hợp kết quả truy vấn này, nếu phần này được chia nhỏ.
<link rel="next" type="application/atom+xml" href="..."/>
Chỉ định URI của phân đoạn tiếp theo của nhóm kết quả truy vấn này nếu phân đoạn.
<link rel="edit" type="application/atom+xml" href="..."/>
Chỉ định URI URI của mục nhập Atom (nơi bạn gửi mục đã cập nhật).

Dưới đây là nội dung phản hồi mẫu, để phản hồi một truy vấn tìm kiếm:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns:atom="http://www.w3.org/2005/Atom"
        xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">
  <id>http://www.example.com/feed/1234.1/posts/full</id> 
  <updated>2005-09-16T00:42:06Z</updated> 
  <title type="text">Books and Romance with Jo and Liz</title> 
  <link rel="alternate" type="text/html" href="http://www.example.net/"/> 
  <link rel="http://schemas.google.com/g/2005#feed"
    type="application/atom+xml"
    href="http://www.example.com/feed/1234.1/posts/full"/> 
  <link rel="http://schemas.google.com/g/2005#post"
    type="application/atom+xml"
    href="http://www.example.com/feed/1234.1/posts/full"/> 
  <link rel="self" type="application/atom+xml"
    href="http://www.example.com/feed/1234.1/posts/full"/> 
  <author>
    <name>Elizabeth Bennet</name> 
    <email>liz@gmail.com</email> 
  </author>
  <generator version="1.0"
    uri="http://www.example.com">Example Generator Engine</generator> 
  <openSearch:totalResults>2</openSearch:totalResults> 
  <openSearch:startIndex>0</openSearch:startIndex> 
  <entry>
    <id>http://www.example.com/feed/1234.1/posts/full/4521614025009481151</id> 
    <published>2005-01-09T08:00:00Z</published> 
    <updated>2005-01-09T08:00:00Z</updated> 
    <category scheme="http://www.example.com/type" term="blog.post"/> 
    <title type="text">This is the title of entry 1009</title> 
    <content type="xhtml">
      <div
        xmlns="http://www.w3.org/1999/xhtml">This is the entry body of entry 1009</div> 
    </content>
    <link rel="alternate" type="text/html"
      href="http://www.example.com/posturl"/> 
    <link rel="edit" type="application/atom+xml"
      href="http://www.example.com/feed/1234.1/posts/full/4521614025009481151"/> 
    <author>
      <name>Elizabeth Bennet</name> 
      <email>liz@gmail.com</email> 
    </author>
  </entry>
  <entry>
    <id>http://www.example.com/feed/1234.1/posts/full/3067545004648931569</id> 
    <published>2005-01-07T08:00:00Z</published> 
    <updated>2005-01-07T08:02:00Z</updated> 
    <category scheme="http://www.example.com/type" term="blog.post"/> 
    <title type="text">This is the title of entry 1007</title> 
    <content type="xhtml">
      <div
        xmlns="http://www.w3.org/1999/xhtml">This is the entry body of entry 1007</div> 
    </content>
    <link rel="alternate" type="text/html"
      href="http://www.example.com/posturl"/> 
    <link rel="edit" type="application/atom+xml"
      href="http://www.example.com/feed/1234.1/posts/full/3067545004648931569"/> 
    <author>
      <name>Elizabeth Bennet</name> 
      <email>liz@gmail.com</email> 
    </author>
  </entry>
</feed>

Nếu nguồn cấp dữ liệu được yêu cầu ở định dạng Atom, nếu không có tham số truy vấn nào được chỉ định và nếu kết quả không chứa tất cả các mục nhập, thì phần tử sau đây sẽ được chèn vào nguồn cấp dữ liệu cấp cao nhất: <link rel="next" type="application/atom+xml" href="..."/>. Nó trỏ đến một nguồn cấp dữ liệu chứa tập hợp các mục nhập tiếp theo. Các nhóm tiếp theo chứa một phần tử <link rel="previous" type="application/atom+xml" href="..."/> tương ứng. Bằng cách nhấp vào tất cả các đường liên kết tiếp theo, ứng dụng có thể truy xuất tất cả mục nhập từ một nguồn cấp dữ liệu.

Mã trạng thái HTTP

Bảng sau đây mô tả ý nghĩa của các mã trạng thái HTTP trong ngữ cảnh của Dịch vụ dữ liệu của Google.

Giải thích
200 OK Không có lỗi.
201 ĐÃ TẠO Đã tạo thành công tài nguyên.
304 KHÔNG ĐƯỢC CHỈNH SỬA Tài nguyên không thay đổi kể từ thời gian chỉ định trong tiêu đề If-Sửa đổi-Từ khi yêu cầu.
400 YÊU CẦU KHÔNG TỐT URI hoặc tiêu đề của yêu cầu không hợp lệ, hoặc tham số không chuẩn được hỗ trợ.
401 KHÔNG ĐƯỢC uỷ quyền Cần có sự cho phép.
403 LẦM TIẾN Không xác thực được thông số chuẩn, hoặc việc xác thực hay uỷ quyền không được hỗ trợ.
404 KHÔNG TÌM THẤY Không tìm thấy tài nguyên (chẳng hạn như nguồn cấp dữ liệu hoặc mục nhập).
409 TRUNG BÌNH Số phiên bản đã chỉ định không khớp với số phiên bản mới nhất của tài nguyên.
500 LỖI MÁY CHỦ NỘI BỘ Lỗi nội bộ. Đây là mã mặc định được sử dụng cho tất cả các lỗi không được nhận dạng.

Tính năng đồng thời tối ưu (phiên bản)

Đôi khi, điều quan trọng là phải đảm bảo rằng nhiều khách hàng không vô tình ghi đè các thay đổi của nhau. Điều này dễ dàng đạt được nhất bằng cách đảm bảo rằng phiên bản hiện tại của mục mà khách hàng đang sửa đổi giống với phiên bản mà ứng dụng đang dựa trên sửa đổi của nó. Nếu ứng dụng thứ hai cập nhật trước ứng dụng đầu tiên thì ứng dụng đầu tiên sẽ bị từ chối vì ứng dụng đầu tiên không còn dựa trên các thay đổi trên phiên bản mới nhất nữa.

Trong các nguồn cấp dữ liệu Google hỗ trợ tạo phiên bản, chúng tôi đạt được các ngữ nghĩa này bằng cách thêm ID phiên bản vào mỗi EditURI của mỗi mục nhập. Xin lưu ý rằng chỉ URI URI bị ảnh hưởng, không phải mã mục nhập. Trong lược đồ này, mỗi bản cập nhật sẽ thay đổi EditURI của mục nhập, do đó đảm bảo rằng các lần cập nhật tiếp theo dựa trên phiên bản gốc sẽ không thành công. Tất nhiên, thao tác xóa giống hệt với các bản cập nhật liên quan đến tính năng này; nếu bạn xóa với số phiên bản cũ thì thao tác xóa không thành công.

Không phải tất cả nguồn cấp dữ liệu của Google đều hỗ trợ tính năng đồng thời lạc quan. Trong một nguồn cấp dữ liệu hỗ trợ việc này, nếu máy chủ phát hiện xung đột phiên bản trên PUT hoặc DELETE, thì máy chủ sẽ phản hồi bằng 409 Conflict. Nội dung của phản hồi chứa trạng thái hiện tại của mục nhập (tài liệu đầu vào Atom). Bạn nên giải quyết xung đột và gửi lại yêu cầu bằng cách sử dụng EditURI từ phản hồi 409.

Động lực và ghi chú thiết kế

Phương pháp đồng thời lạc quan này cho phép chúng tôi triển khai ngữ nghĩa mà chúng tôi muốn mà không cần đánh dấu mới cho mã phiên bản. Điều này giúp phản hồi của Dữ liệu Google tương thích với các điểm cuối không phải là Google Atom.

Thay vì chỉ định ID phiên bản, chúng tôi có thể chọn xem xét dấu thời gian cập nhật trên mỗi mục nhập (/atom:entry/atom:updated). Tuy nhiên, có hai vấn đề khi sử dụng dấu thời gian cập nhật:

  • Nút này chỉ hoạt động để cập nhật và không bị xoá.
  • Điều này buộc các ứng dụng sử dụng giá trị ngày/giờ làm mã phiên bản, khiến việc bổ sung Dữ liệu của Google vào nhiều kho dữ liệu hiện có trở nên khó khăn hơn.

Xác thực

Khi một khách hàng cố gắng truy cập vào một dịch vụ, dịch vụ đó có thể cần cung cấp thông tin đăng nhập của người dùng cho dịch vụ đó, để chứng minh rằng người dùng có quyền thực hiện hành động được đề cập.

Phương pháp mà một ứng dụng nên sử dụng để xác thực phụ thuộc vào loại ứng dụng:

Trong hệ thống ClientLogin, ứng dụng khách dành cho máy tính sẽ yêu cầu người dùng cung cấp thông tin đăng nhập rồi gửi những thông tin đăng nhập đó đến hệ thống xác thực của Google.

Nếu xác thực thành công, thì hệ thống xác thực sẽ trả về một mã thông báo mà ứng dụng sau đó sẽ sử dụng (trong tiêu đề Uỷ quyền HTTP) khi gửi yêu cầu Dữ liệu trên Google.

Nếu xác thực không thành công, máy chủ sẽ trả về mã trạng thái 403 Forbidden, cùng với tiêu đề WWW-Authentication chứa thử thách áp dụng cho quá trình xác thực.

Hệ thống AuthSub hoạt động tương tự như vậy, ngoại trừ việc thay vì yêu cầu người dùng cung cấp thông tin đăng nhập, hệ thống sẽ kết nối người dùng với một dịch vụ của Google yêu cầu thông tin đăng nhập. Sau đó, dịch vụ này sẽ trả về một mã thông báo mà ứng dụng web có thể sử dụng. Ưu điểm của phương pháp này là Google (thay vì giao diện người dùng web) xử lý và lưu trữ an toàn thông tin xác thực của người dùng.

Để biết thông tin chi tiết về các hệ thống xác thực này, hãy xem tài liệu Tổng quan về quá trình xác thực dữ liệu trên Google hoặc Tài khoản Google xác thực.

Trạng thái phiên

Nhiều hoạt động triển khai logic kinh doanh đòi hỏi mức độ gắn bó với phiên — theo dõi trạng thái phiên của người dùng.

Google theo dõi trạng thái phiên theo 2 cách: sử dụng cookie và sử dụng mã thông báo có thể được gửi dưới dạng tham số truy vấn. Cả hai phương pháp đều đạt được hiệu quả như nhau. Khách hàng nên hỗ trợ một trong những phương pháp theo dõi trạng thái phiên này (chỉ một trong hai phương pháp này là đủ). Nếu một ứng dụng không hỗ trợ một trong những phương thức này, thì ứng dụng đó sẽ vẫn hoạt động với Dịch vụ dữ liệu của Google, nhưng hiệu suất có thể bị ảnh hưởng so với những ứng dụng hỗ trợ các phương thức này. Cụ thể là nếu một ứng dụng không hỗ trợ các phương thức này, thì mọi yêu cầu sẽ dẫn đến một lệnh chuyển hướng, do đó mọi yêu cầu (và mọi dữ liệu liên quan) sẽ được gửi đến máy chủ hai lần, ảnh hưởng đến hiệu suất của cả ứng dụng và máy chủ.

Thư viện ứng dụng Google xử lý trạng thái phiên cho bạn, vì vậy nếu sử dụng thư viện của chúng tôi, bạn không cần làm gì để được hỗ trợ trạng thái phiên.

Tài nguyên khác

Bạn có thể thấy các tài liệu bên thứ ba sau đây hữu ích:

Trở lại đầu trang