Sử dụng cURL để tương tác với các dịch vụ Dữ liệu của Google

Cảnh báo: Trang này giới thiệu về các API cũ của Google, API dữ liệu của Google; trang này chỉ liên quan đến các API được liệt kê trong thư mục API dữ liệu của Google, nhiều API trong số này đã được thay thế bằng các API mới hơn. Để biết thông tin về một API mới cụ thể, hãy xem tài liệu của API mới. Để biết thông tin về việc uỷ quyền cho các yêu cầu bằng một API mới hơn, hãy xem phần Xác thực và ủy quyền tài khoản Google.

Ryan Boyd, Nhóm Google Data API
Tháng 9 năm 2007

Giới thiệu

Về cơ bản, API dữ liệu của Google sử dụng nguồn cấp dữ liệu và mục nhập Atom làm định dạng dữ liệu và HTTP làm giao thức để truyền dữ liệu – mở rộng Giao thức xuất bản Atom. Chúng tôi phát hành một số thư viện ứng dụng để giúp bạn tương tác với Google Data API dễ dàng hơn. Tuy nhiên, bạn luôn có thể sử dụng các công cụ cấp thấp hơn để làm việc với các dịch vụ của chúng tôi. Việc này khá dễ dàng với một vài hướng dẫn.

cURL là ứng dụng dòng lệnh để thực hiện các yêu cầu bằng nhiều giao thức bao gồm HTTP. cURL thường được các nhà phát triển sử dụng để kiểm tra các dịch vụ Dữ liệu của Google, vì nó hỗ trợ chức năng HTTP cần thiết để tương tác với các API ở cấp độ thấp.

cURL chỉ hỗ trợ thực hiện hoạt động giao tiếp HTTP, vì vậy, kiến thức về giao thức Dữ liệu trên Google, giao thức dành riêng cho dịch vụ và định dạng dữ liệu XML được sử dụng là điều kiện tiên quyết để làm việc với ứng dụng. Một số công cụ khác được đề cập trong bài viết này để giúp bạn thực hiện những công việc này dễ dàng hơn.

Bài viết này sử dụng ví dụ dựa trên API dữ liệu Album Web Picasa. Tuy nhiên, tất cả những ví dụ này có thể dễ dàng được áp dụng cho các API dữ liệu của Google khác.

Nhận và cài đặt cURL

cURL thường có sẵn khi cài đặt mặc định nhiều nền tảng UNIX/Linux. Hãy thử nhập curl vào màn hình shell yêu thích để xem công cụ này đã được cài đặt và có trong PATH hay không. Nếu bạn chưa cài đặt công cụ này, hãy truy cập vào trang tải xuống trên trang web của cURL để lấy nguồn chính thức hoặc gói nhị phân do người dùng đóng góp. Lưu ý rằng công cụ dòng lệnh sử dụng thư viện libcurl, thư viện này có thể được cung cấp dưới dạng gói tải xuống riêng biệt, vì vậy, nếu bạn không biên dịch từ nguồn, hãy nhớ tải xuống gói ' nhị phân' thay vì gói 'libcurl'. Bạn cần có các gói bật SSL nếu muốn sử dụng cURL để thu thập mã thông báo xác thực hoặc để truy cập một số dịch vụ dữ liệu của Google có yêu cầu sử dụng SSL cho yêu cầu.

Xác thực với một Dịch vụ dữ liệu của Google

Các yêu cầu Dữ liệu Google đã xác thực được thực hiện bằng cách thêm tiêu đề HTTP vào yêu cầu có chứa mã xác thực ClientLogin (ứng dụng dành cho máy tính/thiết bị di động) hoặc AuthSub (ứng dụng web). Đối với mục đích thử nghiệm sử dụng cURL, ClientLogin là phương thức dễ dàng hơn và được nêu dưới đây. Bạn có thể sử dụng tiêu đề xác thực AuthSub với cURL, nhưng quy trình lấy mã thông báo nâng cao hơn nằm ngoài phạm vi của bài viết này.

Sử dụng ClientLogin

ClientLogin dành cho các ứng dụng được cài đặt (máy tính/thiết bị di động). Với phương thức xác thực này, ứng dụng sử dụng API Dữ liệu của Google sẽ trực tiếp xử lý tên người dùng và mật khẩu của người dùng.

Yêu cầu xác thực cho ClientLogin sẽ lấy tên người dùng, mật khẩu và tên dịch vụ làm biến bài đăng trên biểu mẫu. Các biến này được chuyển lần lượt dưới dạng đối số Email, Passwdservice. Yêu cầu này tạo ra phản hồi với một số mã thông báo, một trong số mã này có thể dùng để đưa ra yêu cầu cho dịch vụ Dữ liệu của Google. Lưu ý rằng các đối số dữ liệu được truyền bằng curl phải được mã hoá URL nếu chứa các ký tự không phải ASCII, thường xuất hiện trong các đối số EmailPasswd. Bạn có thể yêu cầu curl mã hoá URL các đối số này bằng cách sử dụng cờ --data-urlencode.

Yêu cầu mẫu:

curl https://www.google.com/accounts/ClientLogin \
--data-urlencode Email=brad.gushue@example.com --data-urlencode Passwd=new+foundland \
-d accountType=GOOGLE \
-d source=Google-cURL-Example \
-d service=lh2

Câu trả lời mẫu:

SID=DQAAAHYBADCv2pSv7nflacDNwz3zEDUGtrSvNVDcpkSfddi77b3U5sEaHmP8YLWhmA36F9rk85mL8J5dqo4apn0T1vKz0fPGI9Xtnuet6cuE2ZzYvrNIwbSC_HjTqF4zudNQnnlDuD2wqZT-g1qXI8KhGAQZV4NexHZoQPlabTsGuRZeIBxj1A
LSID=EUBBBIaBADCl-kNxvRVmcQghpt3cqSMfEooKR9flLOUZqwgP9OrZS83gse-KSdTNeXhxsET7FYenDhceP9lIPOmesH-t9qh-AWUHjjMdZEbUNeF9mWyzln6Z-FajaiG-cVFkqW0ZJ8ZbnCP30xXj6xFK6QxaAcqy_9Pej8jhEnxS9E61ftQGPg
Auth=EUBBIacAAADK-kNxvRVmcQghpt3cqSMfEooLNMflLNIQqwgP9OrZS83gs-KSdTNeXhxsET7FYePWmaD8Vsy1V4LSUGMUP48Je2TO8OcjBj6HgAtPhiZeX-gKDfagZDK44j4n-Tkb44nhOnp2_QPSnBj3Z2vYwOEDjjG3Q53aQVC2132JKOuGh

Vui lòng xem tài liệu ClientLogin để biết thông tin cụ thể về các thông số được sử dụng trong yêu cầu ở trên. Trong ví dụ này, dịch vụ mà chúng tôi đang sử dụng là API dữ liệu Album web Picasa. Tên dịch vụ (service) là lh2. Bạn có thể tìm thấy tên dịch vụ cho các dịch vụ dữ liệu khác của Google trên trang Câu hỏi thường gặp về API Dữ liệu của Google.

Giá trị của mã thông báo Auth trong phản hồi ở trên là giá trị duy nhất cần thiết để xác thực đối với các dịch vụ dữ liệu của Google. Giá trị của mã thông báo này được tạo thành tiêu đề HTTP mà sau đó được sử dụng cho mỗi yêu cầu dịch vụ Dữ liệu của Google.

curl --silent --header "Authorization: GoogleLogin auth=EUBBIacAAADK\
-kNxvRVmcQghpt3cqSMfEooLNMflLNIQqwgP9OrZS83gs-KSdTNeXhxs\
ET7FYePWmaD8Vsy1V4LSUGMUP48Je2TO8OcjBj6HgAtPhiZeX-gKDfag\
ZDK44j4n-Tkb44nhOnp2_QPSnBj3Z2vYwOEDjjG3Q53aQVC2132JKOuGh" \
"http://picasaweb.google.com/data/feed/api/user/default"

Lưu ý: Phương thức thoát các ký tự dòng mới có ký tự dấu gạch chéo ngược (‘\") ở trên không hoạt động trong shell lệnh Windows, vì vậy, bạn phải nhập toàn bộ lệnh trên một dòng nếu bạn đang chạy curl trên Windows.


Truy xuất nguồn cấp dữ liệu và mục nhập

Trong API Dữ liệu của Google, việc truy xuất nguồn cấp dữ liệu và mục nhập được thực hiện bằng cách thực hiện HTTP GET trên một URL, với một tập hợp các tham số truy vấn tùy chọn. Vì chúng ta đang thực hiện yêu cầu GET, nên bạn chỉ cần chuyển tiêu đề xác thực và URL để chuyển đến curl. Ví dụ dưới đây sẽ tiếp tục sử dụng API dữ liệu Album Web Picasa và dùng để truy xuất danh sách album do người dùng đã xác thực sở hữu. Lưu ý rằng trong ví dụ này, chúng tôi đã rút ngắn mã xác thực xuống ABCDEFG, nhưng bạn nên sử dụng mã thông báo đầy đủ (ví dụ: EUBBIacA...32JKOuGh ở trên).

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/default"

Thao tác này sẽ trả về một blob XML chưa được định dạng:

<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#' xmlns:gml='http://www.opengis.net/gml' xmlns:georss='http://www.georss.org/georss' xmlns:photo='http://www.pheed.com/pheed/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gphoto='http://schemas.google.com/photos/2007'><id>http://picasaweb.google.com/data/feed/base/user/brad.gushue</id><updated>2007-09-13T21:30:21.454Z</updated>...</entry></feed>

Có một số công cụ phù hợp để định dạng kết quả này để đầu ra dễ đọc hơn, bao gồm cả tidy. Cách dễ nhất để sử dụng tidy là cung cấp dữ liệu đầu ra từ lệnh curl cho tidy như sau:

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/default" | tidy -xml -indent -quiet

Điều này dẫn đến nguồn cấp dữ liệu dễ đọc hơn, chẳng hạn như sau:

<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' 
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#' 
xmlns:gml='http://www.opengis.net/gml' 
xmlns:georss='http://www.georss.org/georss' 
xmlns:photo='http://www.pheed.com/pheed/' 
xmlns:media='http://search.yahoo.com/mrss/' 
xmlns:batch='http://schemas.google.com/gdata/batch' 
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <id>http://picasaweb.google.com/data/feed/api/user/brad.gushue</id>
  <updated>2007-09-13T21:47:07.337Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#user' />
  <title type='text'>brad.gushue</title>
  <subtitle type='text'></subtitle>
  <icon>
  http://lh6.google.com/brad.gushue/AAAAj9zigp4/AAAAAAAAAAA/RiMAlXV4MFI/s64-c/brad.gushue</icon>
  <link rel='http://schemas.google.com/g/2005#feed'
  type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue' />
  <link rel='alternate' type='text/html'
  href='http://picasaweb.google.com/brad.gushue' />
  <link rel='self' type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue?start-index=1&max-results=1000' />
  <author>
    <name>Brad</name>
    <uri>http://picasaweb.google.com/brad.gushue</uri>
  </author>
  <generator version='1.00' uri='http://picasaweb.google.com/'>
  Picasaweb</generator>
  <openSearch:totalResults>8</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>1000</openSearch:itemsPerPage>
  <gphoto:user>brad.gushue</gphoto:user>
  <gphoto:nickname>Brad</gphoto:nickname>
  <gphoto:thumbnail>
  http://lh6.google.com/brad.gushue/AAAAj9zigp4/AAAAAAAAAAA/RiMAlXV4MFI/s64-c/brad.gushue</gphoto:thumbnail>
  <entry>
    <id>
    http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593</id>
    <published>2007-05-23T04:55:52.000Z</published>
    <updated>2007-05-23T04:55:52.000Z</updated>
    <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/photos/2007#album' />
    <title type='text'>Trip To Italy</title>
    <summary type='text'>This was the recent trip I took to
    Italy.</summary>
    <rights type='text'>public</rights>
    <link rel='http://schemas.google.com/g/2005#feed'
    type='application/atom+xml'
    href='http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/9810315389720904593' />
    <link rel='alternate' type='text/html'
    href='http://picasaweb.google.com/brad.gushue/TripToItalyV2' />
    <link rel='self' type='application/atom+xml'
    href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593' />
    <link rel='edit' type='application/atom+xml'
    href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456' />
    <author>
      <name>Brad</name>
      <uri>http://picasaweb.google.com/brad.gushue</uri>
    </author>
    <gphoto:id>9810315389720904593</gphoto:id>
    <media:group>
    ...
    </media:group>
  </entry>
  <entry>
  ...
  </entry>

</feed>

Bạn có thể truy xuất từng mục nhập theo cách tương tự bằng cách cung cấp URL cho mục nhập, thay vì URL nguồn cấp dữ liệu.

Đang cập nhật mục nhập

Các mục nhập trong API Dữ liệu của Google được cập nhật bằng cách thực hiện một HTTP PUT đối với URL chỉnh sửa có một bản sao XML mới của mục nhập trong phần nội dung của yêu cầu.

  1. Truy xuất mục nhập bằng cách sử dụng giá trị URL atom:link/@rel='self'
  2. Cập nhật mục nhập cục bộ để thực hiện những thay đổi cần thiết
  3. PUT mục nhập quay lại máy chủ, sử dụng giá trị URL atom:link/@rel='edit'

1. Truy xuất mục nhập

Bạn có thể truy xuất mục nhập này bằng cách sử dụng một trong hai URL được in đậm trong khối nguồn cấp dữ liệu ở trên. URL cần thiết là giá trị href cho phần tử linkrel='self'.

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593"

2. Cập nhật mục nhập cục bộ

Sau khi bạn truy xuất mục nhập, mục nhập đó cần được cập nhật bằng cách sử dụng trình chỉnh sửa văn bản hoặc ứng dụng cục bộ để thực hiện mọi thay đổi cần thiết đối với mục nhập đó. Trong lệnh trên để truy xuất mục nhập, chúng ta không đưa kết quả vào tidy như đã làm trong các ví dụ trước. Kết quả là XML đại diện cho cùng một dữ liệu, nhưng có định dạng khác với phiên bản được nhập vào tidy. Với mục đích chỉnh sửa mục nhập, việc sử dụng tidy thường có thể giúp làm việc với XML dễ dàng hơn.

Lưu ý: Hãy nhớ bao gồm tất cả định nghĩa không gian tên XML được dùng làm thuộc tính cho atom:entry khi bạn đăng mục nhập mới. Nếu bạn bỏ qua những trường hợp này, hệ thống sẽ phân tích cú pháp các trường hợp ngoại lệ. Ngoài ra, tidy sẽ thay thế khoảng trắng giữa các định nghĩa không gian tên bằng các ký tự dòng mới. Mặc dù đây là XML hợp lệ, nhưng tại thời điểm này, Dịch vụ dữ liệu của Google không chấp nhận việc này. Nếu bạn đang sử dụng tidy, hãy nhớ thêm khoảng trống giữa các thuộc tính này trên phần tử entry.

3. Cập nhật mục nhập trên máy chủ

Khi sử dụng URL edit, bạn cần PUT bản sao của mục nhập đến dịch vụ sử dụng cURL. Bạn cần thêm tiêu đề để cho biết loại nội dung đang được gửi đến máy chủ. Đoạn mã sau đây giả định rằng tệp có mục nhập đã cập nhật được lưu trong update_entry.xml.

curl --silent --data-binary "@updated_entry.xml" --request PUT --header "Content-Type: application/atom+xml" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456"

Tạo mục nhập

Các mục nhập trong API Dữ liệu của Google được tạo bằng cách nhập HTTP POST vào URL của bài đăng với một mục nhập mới. atom:id do máy chủ chỉ định, do đó không cần thiết phải đưa vào mục nhập mới. Cách dễ nhất để tạo mục nhập mới là lấy một mục cũ và sửa đổi nó. Ví dụ sau đây sẽ chỉ có chức năng đó.

  1. Truy xuất mục nhập mẫu bằng atom:link/@rel='self'
  2. Sửa đổi mục nhập mẫu trên máy để xóa thông tin không cần thiết và thực hiện các thay đổi cần thiết
  3. POST mục nhập quay lại máy chủ, sử dụng URL post cho nguồn cấp dữ liệu. Bạn có thể tìm thấy giá trị này trong nguồn cấp dữ liệu được truy xuất dưới dạng giá trị href cho phần tử linkrel='http://schemas.google.com/g/2005#post', hoặc trong tài liệu về dịch vụ trên http://code.google.com.

1. Truy xuất mục nhập mẫu

Bạn có thể truy xuất một mục nhập bằng cách sử dụng giá trị href của phần tử link với rel='self' giống như cách nhập một mục nhập trước khi cập nhật trong ví dụ trên.

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593" | tidy -xml -indent -quiet > template_entry.xml

Phản hồi sau khi sử dụng tidy sẽ có dạng như sau:

<entry xmlns='http://www.w3.org/2005/Atom' 
xmlns:exif='http://schemas.google.com/photos/exif/2007'
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'
xmlns:gml='http://www.opengis.net/gml'
xmlns:georss='http://www.georss.org/georss'
xmlns:photo='http://www.pheed.com/pheed/'
xmlns:media='http://search.yahoo.com/mrss/'
xmlns:batch='http://schemas.google.com/gdata/batch'
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <id>
  http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981</id>
  <published>2007-05-23T04:55:52.000Z</published>
  <updated>2007-05-23T04:55:52.000Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#album' />
  <title type='text'>Trip To Italy</title>
  <summary type='text'>This was the recent trip I took to
  Italy.</summary>
  <rights type='text'>public</rights>
  <link rel='http://schemas.google.com/g/2005#feed'
  type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/9810315389741123981' />
  <link rel='alternate' type='text/html'
  href='http://picasaweb.google.com/brad.gushue/TripToItaly' />
  <link rel='self' type='application/atom+xml'
  href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981' />
  <link rel='edit' type='application/atom+xml'
  href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981/1179896152905401' />
  <author>
    <name>Brad</name>
    <uri>http://picasaweb.google.com/brad.gushue</uri>
  </author>
  <gphoto:id>9810315389741123981</gphoto:id>
  <gphoto:name>TripToItaly</gphoto:name>
  <gphoto:location></gphoto:location>
  <gphoto:access>public</gphoto:access>
  <gphoto:timestamp>1179896152000</gphoto:timestamp>
  <gphoto:numphotos>0</gphoto:numphotos>
  <gphoto:numphotosremaining>500</gphoto:numphotosremaining>
  <gphoto:bytesUsed>0</gphoto:bytesUsed>
  <gphoto:user>brad.gushue</gphoto:user>
  <gphoto:nickname>Brad</gphoto:nickname>
  <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
  <gphoto:commentCount>0</gphoto:commentCount>
  <media:group>
    <media:title type='plain'>Trip To Italy</media:title>
    <media:description type='plain'>This was the recent trip I took
    to Italy.</media:description>
    <media:keywords></media:keywords>
    <media:content url='http://lh5.google.com/brad.gushue/ADFUFKqeA5E/AAAAAAAAABc/V6Sga_Z03WU/TripToItaly.jpg'
    type='image/jpeg' medium='image' />
    <media:thumbnail url='http://lh5.google.com/brad.gushue/ADFUFKqeA5E/AAAAAAAAABc/V6Sga_Z03WU/s160-c/TripToItaly.jpg'
    height='160' width='160' />
    <media:credit>Brad</media:credit>
  </media:group>

</entry>

2. Sửa đổi mục nhập mẫu

Chúng tôi muốn tạo một album có tên là "Bi đá trên băng ở Canada" kèm theo ảnh từ trận đấu bi đá trên băng gần đây của chúng tôi. Dữ liệu của Google cho phép bạn thả các phần tử Atom mà máy chủ cung cấp giá trị, vì vậy để tạo mục nhập mẫu đơn giản này, chúng ta sẽ xóa atom:id, atom:published, atom:updated, atom:author và nhiều phần tử atom:link trong nguồn cấp dữ liệu. Thao tác này sẽ cung cấp cho chúng tôi mục nhập mẫu đơn giản. Sau đó, bạn cần sửa đổi mục nhập để đại diện cho album mới mà chúng tôi đang tạo:

<entry xmlns='http://www.w3.org/2005/Atom' 
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#album' />
  <title type='text'>Curling in Canada</title>
  <summary type='text'>Pictures of all my curling matches in Canada.</summary>
  <gphoto:location>Canada</gphoto:location>
  <gphoto:access>public</gphoto:access>
  <gphoto:commentingEnabled>true</gphoto:commentingEnabled>

</entry>

Lưu ý: Hãy nhớ bao gồm tất cả định nghĩa không gian tên XML được dùng làm thuộc tính cho atom:entry khi bạn đăng mục nhập mới. Nếu bạn bỏ qua những trường hợp này, hệ thống sẽ phân tích cú pháp các trường hợp ngoại lệ. Ngoài ra, tidy sẽ thay thế các khoảng trắng giữa các định nghĩa không gian tên và thay thế các ký tự đó bằng các ký tự dòng mới. Mặc dù đây là XML hợp lệ, nhưng tại thời điểm này, Dịch vụ dữ liệu của Google không chấp nhận việc này. Nếu bạn đang sử dụng tidy, hãy nhớ thêm khoảng trống giữa các thuộc tính này trên phần tử entry.

3. Đăng mục nhập mới lên máy chủ

Lệnh curl để đăng một mục mới lên máy chủ rất giống với việc cập nhật một mục hiện có, ngoại trừ URL khác:

curl --silent --request POST --data-binary "@template_entry.xml" --header "Content-Type: application/atom+xml" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/brad.gushue" | tidy -xml -indent -quiet

Nếu bài đăng thành công, kết quả XML sẽ là bản sao của mục mới tạo. Mục nhập này sẽ bao gồm những nội dung mà máy chủ đã tạo tại thời điểm mục nhập được tạo, bao gồm các giá trị cho phần tử atom:id, atom:published, atom:updatedatom:link. Bạn có thể dùng các giá trị link thu được để chỉnh sửa hoặc xoá mục nhập, miễn là không có thay đổi nào khác được đưa ra trong thời gian tạm thời.

Đang xoá các mục

Thao tác xoá mục nhập rất giống với cách cập nhật mục nhập, ngoại trừ việc sử dụng phương thức HTTP DELETE thay vì HTTP PUT và không cần gửi dữ liệu. Cũng giống như yêu cầu cập nhật, URL edit được dùng làm mục tiêu của yêu cầu HTTP.

curl --silent --request DELETE --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456"

Tải các đối tượng nghe nhìn lên

Một tính năng quan trọng của API dữ liệu Album web Picasa và API dữ liệu danh sách tài liệu là khả năng tải lên các đối tượng nhị phân. cURL có thể dễ dàng thực hiện tải lên dữ liệu nhị phân và tiêu đề slug. Tuy nhiên, API dữ liệu danh sách tài liệu hiện yêu cầu đăng XML cùng với dữ liệu nhị phân dưới dạng thông báo nhiều phần MIME. Bài viết này không thuộc phạm vi áp dụng cho việc tạo thông báo nhiều phần.

Ví dụ dưới đây minh hoạ cách tải một hình ảnh có tên sweeping_the_rock.png lên Album Web Picasa có tiêu đề "Sweing the rock":

curl --silent --request POST --data-binary "@sweeping_the_rock.png" --header "Slug: Sweeping the rock" --header "Content-Type: image/png" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/5113621341847124417" | tidy -xml -indent -quiet

Các công cụ dòng lệnh khác

Một số nhà phát triển thích tìm hiểu hoặc gỡ lỗi bằng các công cụ dòng lệnh khác.

Các công cụ phổ biến bao gồm:

  • telnet, openssl dùng để tạo kết nối ổ cắm thô (tương ứng với văn bản thuần tuý và dựa trên ssl) và có thể dùng để tương tác với các dịch vụ Dữ liệu của Google. Xin lưu ý rằng một số dịch vụ dữ liệu của Google có thể không hỗ trợ SSL. Dưới đây là cách bạn kết nối:
    • telnet picasaweb.google.com 80 (API dữ liệu Album Web Picasa)
    • openssl s_client -connect www.google.com:443 (API dữ liệu Lịch Google và các dịch vụ khác trên www.google.com)
    Sau khi kết nối, bạn phải gửi một yêu cầu HTTP thô. Yêu cầu này bao gồm động từ HTTP, đường dẫn tương đối, phiên bản, tất cả tiêu đề và nội dung của yêu cầu. Dưới đây là ví dụ:
    POST /data/feed/api/user/brad.gushue HTTP/1.1
    Host: picasaweb.google.com
    Authorization: GoogleLogin auth=ABCDEFG
    Content-Length: 493
    
    <entry xmlns='http://www.w3.org/2005/Atom' 
    xmlns:gphoto='http://schemas.google.com/photos/2007'>
      <category scheme='http://schemas.google.com/g/2005#kind'
      term='http://schemas.google.com/photos/2007#album' />
      <title type='text'>Curling in Canada</title>
      <summary type='text'>Pictures of all my curling matches in Canada.</summary>
      <gphoto:location>Canada</gphoto:location>
      <gphoto:access>public</gphoto:access>
      <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
    
    </entry>
    
    Khi gửi dữ liệu HTTP thô, hãy lưu ý rằng thao tác POSTPUT sẽ yêu cầu điện toán giá trị cho tiêu đề Content-Length. Bạn có thể sử dụng công cụ UNIX wc để tính toán giá trị này. Đặt tất cả nội dung của nội dung HTTP vào một tệp văn bản như template_entry.xml (ví dụ được sử dụng ở trên) và chạy wc -c template_entry.xml. Thông thường, rất khó để gỡ lỗi nếu bạn vô tình sử dụng một giá trị không chính xác cho tiêu đề Content-Length.
  • wget thường được dùng để tải dữ liệu từ máy chủ web xuống tệp cục bộ. Tuy nhiên, wget có rất nhiều lựa chọn để có thể thực hiện tất cả các loại yêu cầu cần thiết để tương tác với các dịch vụ của Google Data. Dưới đây là ví dụ về cách sử dụng wget để POST nhập mục album mới vào Album Web Picasa:
    wget --post-file template_entry.xml --header "Authorization: GoogleLogin auth=ABCDEFG" --header "Content-Type: application/atom+xml" "http://picasaweb.google.com/data/feed/api/user/brad.gushue"
    
  • webkittproc là một công cụ áp dụng các phép biến đổi DNSKEY (XSLT) cho các tài liệu XML. Bạn có thể sử dụng tính năng này để dễ dàng trích xuất các bit dữ liệu mong muốn từ một mục nhập XML hoặc nguồn cấp dữ liệu do API dữ liệu Google trả về, hoặc để tạo mục nhập mới hoặc mục cập nhật.

Kết luận

Như bạn đã thấy, cURL và một số công cụ dòng lệnh khác có thể được dùng để dễ dàng tương tác với các dịch vụ Dữ liệu của Google bằng XML và HTTP thô. Vui lòng tham gia cùng chúng tôi trong các diễn đàn cụ thể về API nếu bạn có thắc mắc về cách sử dụng các công cụ này với API Dữ liệu của Google mà bạn yêu thích.