การใช้ cURL เพื่อโต้ตอบกับบริการข้อมูลของ Google

คำเตือน: หน้านี้เป็นข้อมูลเกี่ยวกับ Google Data API ซึ่งเป็น API รุ่นเก่าของ Google โดยเกี่ยวข้องกับ API ที่แสดงอยู่ในไดเรกทอรี Google Data API เท่านั้น ซึ่ง API หลายรายการถูกแทนที่ด้วย API รุ่นใหม่กว่าแล้ว ดูข้อมูลเกี่ยวกับ API ใหม่ที่เฉพาะเจาะจงได้ในเอกสารประกอบของ API ใหม่ ดูข้อมูลเกี่ยวกับการให้สิทธิ์คำขอด้วย API เวอร์ชันใหม่กว่าได้ที่การตรวจสอบสิทธิ์และการให้สิทธิ์บัญชี Google

Ryan Boyd, ทีม Google Data APIs
กันยายน 2007

บทนำ

โดยพื้นฐานแล้ว Google Data API จะใช้ฟีดและรายการ Atom (XML) เป็นรูปแบบข้อมูล และ HTTP เป็นโปรโตคอลสำหรับการส่งข้อมูล ซึ่งเป็นการขยายโปรโตคอลการเผยแพร่ Atom เราเผยแพร่ไลบรารีของไคลเอ็นต์จำนวนมากเพื่อให้การโต้ตอบกับ Google Data API ง่ายขึ้น อย่างไรก็ตาม คุณสามารถใช้เครื่องมือระดับล่างเพื่อทำงานกับบริการของเราได้ทุกเมื่อ และการทำเช่นนี้ก็ค่อนข้างง่ายหากมีคำแนะนำเล็กๆ น้อยๆ

cURL เป็นแอปพลิเคชันบรรทัดคำสั่งสำหรับส่งคำขอโดยใช้โปรโตคอลต่างๆ รวมถึง HTTP นักพัฒนาซอฟต์แวร์มักใช้ cURL เพื่อทดสอบบริการข้อมูลของ Google เนื่องจากรองรับฟังก์ชัน HTTP ที่จำเป็นต่อการโต้ตอบกับ API ในระดับต่ำ

cURL รองรับเฉพาะการสื่อสารผ่าน HTTP ดังนั้นความรู้เกี่ยวกับโปรโตคอลข้อมูลของ Google, โปรโตคอลเฉพาะบริการ และรูปแบบข้อมูล XML ที่ใช้จึงเป็นข้อกำหนดเบื้องต้นสำหรับการทำงานกับแอปพลิเคชัน บทความนี้จะกล่าวถึงเครื่องมืออื่นๆ ที่จะช่วยให้งานเหล่านี้ง่ายขึ้น

บทความนี้ใช้ตัวอย่างที่อิงตาม Picasa Web Albums Data API อย่างไรก็ตาม คุณสามารถนำตัวอย่างทั้งหมดเหล่านี้ไปใช้กับ Google Data API อื่นๆ ได้อย่างง่ายดาย

การขอรับและติดตั้ง cURL

cURL มักจะพร้อมใช้งานในการติดตั้งเริ่มต้นของแพลตฟอร์ม UNIX/Linux หลายแพลตฟอร์ม ลองพิมพ์ curl ในเชลล์ที่คุณชื่นชอบเพื่อดูว่ามีการติดตั้งเครื่องมือและอยู่ใน PATH หรือไม่ หากไม่ได้ติดตั้งเครื่องมือนี้ ให้ไปที่หน้าดาวน์โหลดในเว็บไซต์ cURL เพื่อรับแหล่งที่มาอย่างเป็นทางการหรือแพ็กเกจไบนารีที่ผู้ใช้มีส่วนร่วม โปรดทราบว่าเครื่องมือบรรทัดคำสั่งใช้ไลบรารี libcurl ซึ่งอาจมีให้ดาวน์โหลดเป็นแพ็กเกจแยกต่างหาก ดังนั้นหากไม่ได้คอมไพล์จากแหล่งที่มา โปรดดาวน์โหลดแพ็กเกจ "ไบนารี" แทนแพ็กเกจ "libcurl" คุณต้องใช้แพ็กเกจที่เปิดใช้ SSL หากต้องการใช้ cURL เพื่อรับโทเค็นการตรวจสอบสิทธิ์หรือเข้าถึงบริการข้อมูลบางอย่างของ Google ซึ่งต้องใช้ SSL สำหรับคำขอ

การตรวจสอบสิทธิ์ไปยัง Google Data Service

คำขอข้อมูล Google ที่ได้รับการตรวจสอบสิทธิ์จะดำเนินการโดยการเพิ่มส่วนหัว HTTP ลงในคำขอซึ่งมีโทเค็นการตรวจสอบสิทธิ์ ClientLogin (แอปบนเดสก์ท็อป/อุปกรณ์เคลื่อนที่) หรือ AuthSub (เว็บแอป) สำหรับการทดสอบโดยใช้ cURL นั้น ClientLogin เป็นวิธีที่ง่ายกว่าและมีเอกสารประกอบอยู่ด้านล่าง สามารถใช้ส่วนหัวการตรวจสอบสิทธิ์ AuthSub กับ cURL ได้ แต่กระบวนการที่ซับซ้อนกว่าในการขอรับโทเค็นอยู่นอกเหนือขอบเขตของบทความนี้

การใช้ ClientLogin

ClientLogin มีไว้สำหรับแอปพลิเคชันที่ติดตั้ง (เดสก์ท็อป/อุปกรณ์เคลื่อนที่) เมื่อใช้การตรวจสอบสิทธิ์วิธีนี้ แอปพลิเคชันที่ใช้ Google Data APIs จะจัดการชื่อผู้ใช้และรหัสผ่านของผู้ใช้โดยตรง

คำขอการตรวจสอบสิทธิ์สำหรับ ClientLogin จะใช้ชื่อผู้ใช้ รหัสผ่าน และชื่อบริการเป็นตัวแปรการโพสต์แบบฟอร์ม ระบบจะส่งตัวแปรเหล่านี้เป็นอาร์กิวเมนต์ Email, Passwd และ service ตามลำดับ คำขอนี้จะให้การตอบกลับที่มีโทเค็นหลายรายการ ซึ่งสามารถใช้โทเค็นรายการใดรายการหนึ่งเพื่อส่งคำขอไปยังบริการข้อมูลของ Google ได้ โปรดทราบว่าอาร์กิวเมนต์ข้อมูลที่ส่งด้วย curl ต้องเข้ารหัส URL หากมีอักขระที่ไม่ใช่ ASCII ซึ่งมักปรากฏในอาร์กิวเมนต์ Email และ Passwd คุณขอให้ curl เข้ารหัส URL ของอาร์กิวเมนต์เหล่านี้ได้โดยใช้แฟล็ก --data-urlencode

ตัวอย่างคำขอ

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

ตัวอย่างการตอบกลับ

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

โปรดดูเอกสารประกอบ ClientLogin เพื่อดูข้อมูลเฉพาะเกี่ยวกับพารามิเตอร์ที่ใช้ในคำขอข้างต้น ในตัวอย่างนี้ บริการที่เราใช้คือ Picasa Web Albums Data API ชื่อบริการ (service) คือ lh2 คุณดูชื่อบริการสำหรับบริการข้อมูลอื่นๆ ของ Google ได้ในหน้าคำถามที่พบบ่อยเกี่ยวกับ Google Data APIs

ค่าของโทเค็น Auth ในการตอบกลับข้างต้นเป็นค่าเดียวที่จำเป็นสำหรับการตรวจสอบสิทธิ์ในบริการข้อมูลของ Google ค่าของโทเค็นนี้จะอยู่ในรูปแบบส่วนหัว HTTP ซึ่งจะใช้สำหรับคำขอแต่ละรายการไปยังบริการข้อมูลของ Google

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

หมายเหตุ: วิธีหลีกเลี่ยงอักขระขึ้นบรรทัดใหม่ด้วยอักขระแบ็กสแลช ("\") ด้านบนใช้ไม่ได้ในเชลล์คำสั่งของ Windows ดังนั้นคุณต้องป้อนคำสั่งทั้งหมดในบรรทัดเดียวหากเรียกใช้ curl ใน Windows


การเรียกข้อมูลฟีดและรายการ

ใน Google Data APIs การดึงข้อมูลฟีดและรายการจะทำได้โดยการดำเนินการ HTTP GET ใน URL พร้อมชุดพารามิเตอร์การค้นหาที่ไม่บังคับ เนื่องจากเรากำลังดำเนินการตามคำขอ GET จึงจำเป็นต้องส่งเฉพาะส่วนหัวการให้สิทธิ์และ URL ไปยัง curl ตัวอย่างด้านล่างจะใช้ Picasa Web Albums Data API ต่อไป และใช้เพื่อดึงรายการอัลบั้มที่เป็นของผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์ โปรดทราบว่าเราได้ย่อโทเค็นการให้สิทธิ์เป็น ABCDEFG ในตัวอย่างนี้ แต่คุณควรใช้โทเค็นแบบเต็ม (เช่น EUBBIacA...32JKOuGh จากด้านบน) แทน

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

ซึ่งจะแสดงผล Blob ของ XML ที่ไม่ได้จัดรูปแบบ

<?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>

มีเครื่องมือที่เหมาะสมบางอย่างสำหรับการจัดรูปแบบเอาต์พุตนี้เพื่อให้มนุษย์อ่านได้ง่ายขึ้น ซึ่งรวมถึง tidy วิธีที่ง่ายที่สุดในการใช้ Tidy คือการส่งเอาต์พุตจากคำสั่ง Curl ไปยัง Tidy ดังนี้

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

ซึ่งจะทำให้ฟีดอ่านง่ายขึ้นมาก ดังนี้

<?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>

คุณสามารถดึงข้อมูลรายการแต่ละรายการได้ในลักษณะเดียวกันโดยระบุ URL ของรายการนั้นๆ แทน URL ของฟีด

การอัปเดตรายการ

การอัปเดตรายการใน Google Data API ทำได้โดยการ HTTP PUT ไปยัง URL การแก้ไขพร้อมสำเนา XML ใหม่ของรายการในเนื้อหาของคำขอ

  1. เรียกข้อมูลรายการโดยใช้atom:link/@rel='self'ค่า URL
  2. อัปเดตรายการในเครื่องเพื่อทำการเปลี่ยนแปลงที่จำเป็น
  3. PUT รายการกลับไปยังเซิร์ฟเวอร์โดยใช้ค่า atom:link/@rel='edit' URL

1. การเรียกข้อมูลรายการ

คุณดึงข้อมูลรายการได้โดยใช้ URL ใด URL หนึ่งที่ทำตัวหนาในบล็อกฟีดด้านบน URL ที่ต้องการคือค่า href สำหรับองค์ประกอบ link ที่มี rel='self'

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

2. อัปเดตรายการในเครื่อง

หลังจากดึงข้อมูลรายการแล้ว คุณจะต้องอัปเดตรายการโดยใช้โปรแกรมแก้ไขข้อความหรือแอปพลิเคชันในเครื่องเพื่อทำการเปลี่ยนแปลงที่จำเป็นกับรายการ ในคำสั่งด้านบนเพื่อดึงข้อมูลรายการ เราไม่ได้ส่งผลลัพธ์ไปยัง tidy เหมือนกับที่เราทำในตัวอย่างก่อนหน้า ผลลัพธ์คือ XML ที่แสดงข้อมูลเดียวกัน แต่มีการจัดรูปแบบแตกต่างจากเวอร์ชันที่ส่งผ่านไปยัง tidy สำหรับการแก้ไขรายการด้วยตนเอง การใช้ tidy มักจะช่วยให้การทำงานกับ XML ง่ายขึ้น

หมายเหตุ: โปรดอย่าลืมใส่คำจำกัดความเนมสเปซ XML ทั้งหมดที่ใช้เป็นแอตทริบิวต์กับ atom:entry เมื่อโพสต์รายการใหม่ การละเว้นข้อมูลเหล่านี้จะทำให้เกิดข้อยกเว้นในการแยกวิเคราะห์ นอกจากนี้ tidy จะแทนที่ช่องว่างระหว่างคำจำกัดความเนมสเปซด้วยอักขระขึ้นบรรทัดใหม่ แม้ว่าจะเป็น XML ที่ถูกต้อง แต่บริการข้อมูลของ Google ไม่ยอมรับในขณะนี้ หากคุณใช้ tidy โปรดเพิ่มช่องว่างระหว่างแอตทริบิวต์เหล่านี้ในองค์ประกอบ entry

3. อัปเดตรายการในเซิร์ฟเวอร์

เมื่อใช้ edit URL คุณจะต้องPUTสำเนาของรายการไปยังบริการโดยใช้ cURL ต้องเพิ่มส่วนหัวเพื่อระบุประเภทเนื้อหาที่ส่งไปยังเซิร์ฟเวอร์ ข้อมูลโค้ดต่อไปนี้ถือว่าไฟล์ที่มีรายการที่อัปเดตจะบันทึกใน updated_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"

การสร้างรายการ

รายการใน Google Data APIs สร้างขึ้นโดยการทำ HTTP POST ไปยัง URL ของโพสต์พร้อมกับรายการใหม่ เซิร์ฟเวอร์จะเป็นผู้กำหนด atom:id จึงไม่จำเป็นต้องรวมไว้ในรายการใหม่ วิธีที่ง่ายที่สุดในการสร้างรายการใหม่คือการนำรายการเก่ามาแก้ไข ตัวอย่างต่อไปนี้จะทำเช่นนั้น

  1. ดึงข้อมูลรายการเทมเพลตโดยใช้ atom:link/@rel='self'
  2. แก้ไขรายการเทมเพลตในเครื่องเพื่อนำข้อมูลที่ไม่จำเป็นออกและทำการเปลี่ยนแปลงที่จำเป็น
  3. POST รายการกลับไปยังเซิร์ฟเวอร์โดยใช้ URL post สำหรับฟีด โดยจะอยู่ในฟีดที่ดึงข้อมูลมาเป็นค่า href ขององค์ประกอบ link ที่มี rel='http://schemas.google.com/g/2005#post' หรือในเอกสารประกอบของบริการที่ http://code.google.com

1. เรียกข้อมูลรายการเทมเพลต

คุณสามารถดึงข้อมูลรายการเดียวได้โดยใช้ค่า href ขององค์ประกอบ link ที่มี rel='self' ในลักษณะเดียวกับที่ดึงข้อมูลรายการก่อนที่จะอัปเดตในตัวอย่างข้างต้น

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

คำตอบหลังจากใช้ tidy จะมีลักษณะดังนี้

<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. แก้ไขรายการเทมเพลต

เราต้องการสร้างอัลบั้มชื่อ "เคอร์ลิงในแคนาดา" โดยใช้รูปภาพจากการแข่งขันเคอร์ลิงล่าสุด ข้อมูล Google ช่วยให้คุณวางองค์ประกอบ Atom ที่เซิร์ฟเวอร์ระบุค่าได้ ดังนั้นในการสร้างรายการเทมเพลตอย่างง่ายนี้ เราจะนำองค์ประกอบ atom:id, atom:published, atom:updated, atom:author และองค์ประกอบ atom:link ต่างๆ ในฟีดออก ซึ่งจะทำให้เราได้รายการเทมเพลตที่ตัดทอนแล้ว จากนั้นต้องแก้ไขรายการเพื่อแสดงอัลบั้มใหม่ที่เรากำลังสร้าง

<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>

หมายเหตุ: โปรดอย่าลืมใส่คำจำกัดความเนมสเปซ XML ทั้งหมดที่ใช้เป็นแอตทริบิวต์กับ atom:entry เมื่อโพสต์รายการใหม่ การละเว้นข้อมูลเหล่านี้จะทำให้เกิดข้อยกเว้นในการแยกวิเคราะห์ นอกจากนี้ tidy จะแทนที่ช่องว่างระหว่างคำจำกัดความเนมสเปซด้วยอักขระขึ้นบรรทัดใหม่ แม้ว่าจะเป็น XML ที่ถูกต้อง แต่บริการข้อมูลของ Google ไม่ยอมรับในขณะนี้ หากคุณใช้ tidy โปรดเพิ่มช่องว่างระหว่างแอตทริบิวต์เหล่านี้ในองค์ประกอบ entry

3. โพสต์รายการใหม่ไปยังเซิร์ฟเวอร์

คำสั่ง curl สำหรับโพสต์รายการใหม่ไปยังเซิร์ฟเวอร์จะคล้ายกับการอัปเดตรายการที่มีอยู่มาก ยกเว้น URL ที่แตกต่างกัน

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

หากโพสต์สำเร็จ เอาต์พุต XML ที่ได้จะเป็นสำเนาของรายการที่สร้างขึ้นใหม่ รายการนี้จะมีข้อมูลที่เซิร์ฟเวอร์สร้างขึ้นในขณะที่สร้างรายการ ซึ่งรวมถึงค่าสำหรับองค์ประกอบ atom:id, atom:published, atom:updated และ atom:link คุณใช้linkค่าที่ได้เพื่อแก้ไขหรือลบรายการได้ หากไม่มีการเปลี่ยนแปลงเพิ่มเติมในระหว่างนี้

การลบรายการ

การลบรายการจะคล้ายกับการอัปเดตรายการมาก ยกเว้นว่าจะใช้เมธอด HTTP DELETE แทน HTTP PUT และไม่จำเป็นต้องส่งข้อมูล เช่นเดียวกับคำขออัปเดต ระบบจะใช้ URL ของ edit เป็นเป้าหมายของคำขอ HTTP

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

การอัปโหลดออบเจ็กต์สื่อ

ฟีเจอร์สำคัญของ Picasa Web Albums Data API และ Documents List Data API คือความสามารถในการอัปโหลดออบเจ็กต์ไบนารี cURL ช่วยให้อัปโหลดข้อมูลไบนารีและส่วนหัวของ Slug ได้อย่างง่ายดาย อย่างไรก็ตาม ปัจจุบัน Documents List Data API กำหนดให้โพสต์ XML พร้อมกับข้อมูลไบนารีเป็นข้อความ MIME แบบหลายส่วน การสร้างข้อความแบบหลายส่วนอยู่นอกเหนือขอบเขตของบทความนี้

ตัวอย่างด้านล่างแสดงวิธีอัปโหลดรูปภาพชื่อ sweeping_the_rock.png ไปยัง Picasa Web Album ที่มีชื่อว่า "Sweeping 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

เครื่องมือบรรทัดคำสั่งอื่นๆ

นักพัฒนาแอปบางรายอาจต้องการเรียนรู้หรือแก้ไขข้อบกพร่องโดยใช้เครื่องมือบรรทัดคำสั่งอื่นๆ

เครื่องมือยอดนิยม ได้แก่

  • telnet, openssl ใช้สำหรับการเชื่อมต่อซ็อกเก็ตดิบ (ข้อความธรรมดาและ SSL ตามลำดับ) กับเว็บเซิร์ฟเวอร์ และใช้เพื่อโต้ตอบกับบริการข้อมูลของ Google ได้ โปรดทราบว่าบริการข้อมูลของ Google บางอย่างอาจไม่รองรับ SSL วิธีเปิดการเชื่อมต่อมีดังนี้
    • telnet picasaweb.google.com 80 (Picasa Web Albums Data API)
    • openssl s_client -connect www.google.com:443 (Google Calendar Data API และบริการอื่นๆ ใน www.google.com)
    หลังจากสร้างการเชื่อมต่อแล้ว คุณต้องส่งคำขอ HTTP ดิบ คำขอนี้ประกอบด้วยกริยา HTTP, เส้นทางแบบสัมพัทธ์, เวอร์ชัน, ส่วนหัวทั้งหมด และเนื้อหาของคำขอ เช่น
    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>
    
    เมื่อส่งข้อมูล HTTP ดิบ โปรดทราบว่าการดำเนินการ POST และ PUT จะต้องคำนวณค่าสำหรับส่วนหัว Content-Length คุณใช้เครื่องมือ UNIX wc เพื่อคำนวณค่านี้ได้ วางเนื้อหาทั้งหมดของส่วนเนื้อหา HTTP ลงในไฟล์ข้อความ เช่น template_entry.xml (ตัวอย่างที่ใช้ด้านบน) แล้วเรียกใช้ wc -c template_entry.xml การแก้ไขข้อบกพร่องมักทำได้ยากหากคุณใช้ค่าที่ไม่ถูกต้องสำหรับส่วนหัว Content-Length โดยไม่ตั้งใจ
  • โดยปกติแล้วจะใช้ wget เพื่อดาวน์โหลดข้อมูลจากเว็บเซิร์ฟเวอร์ไปยังไฟล์ในเครื่อง อย่างไรก็ตาม wget มีตัวเลือกมากมายที่ทำให้สามารถดำเนินการกับคำขอประเภทต่างๆ ที่จำเป็นต่อการโต้ตอบกับบริการข้อมูลของ Google ได้ ตัวอย่างวิธีใช้ wget เพื่อPOSTรายการอัลบั้มใหม่ไปยัง Picasa Web Albums มีดังนี้
    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"
    
  • xsltproc เป็นเครื่องมือที่ใช้ในการใช้การเปลี่ยนรูปแบบ XSL (XSLT) กับเอกสาร XML ซึ่งใช้เพื่อดึงข้อมูลที่ต้องการจากรายการหรือฟีด XML ที่ Google Data API แสดงผล หรือเพื่อสร้างหรืออัปเดตรายการใหม่ได้อย่างง่ายดาย

บทสรุป

ดังที่ได้เห็นไปแล้ว คุณสามารถใช้ cURL และเครื่องมือบรรทัดคำสั่งอื่นๆ อีกหลายอย่างเพื่อโต้ตอบกับบริการข้อมูลของ Google ได้อย่างง่ายดายโดยใช้ XML และ HTTP แบบดิบ โปรดเข้าร่วมฟอรัมเฉพาะ API หากมีคำถามเกี่ยวกับการใช้เครื่องมือเหล่านี้กับ Google Data API ที่คุณชื่นชอบ