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

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

Ryan Boyd จากทีม Google Data API
กันยายน 2007

บทนำ

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

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

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

บทความนี้ใช้ตัวอย่างจาก API ข้อมูล Picasa Web Albums อย่างไรก็ตาม ตัวอย่างเหล่านี้สามารถนําไปใช้กับ Google Data API อื่นๆ

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

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

การตรวจสอบสิทธิ์กับบริการข้อมูลของ Google

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

การใช้ ClientLogin

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

คําขอการตรวจสอบสิทธิ์สําหรับ ClientLogin จะใช้ชื่อผู้ใช้ รหัสผ่าน และชื่อบริการเป็นตัวแปรของโพสต์ในแบบฟอร์ม ตัวแปรเหล่านี้ส่งผ่านเป็นอาร์กิวเมนต์ Email, Passwd และ service ตามลําดับ คําขอนี้จะให้การตอบกลับด้วยโทเค็นหลายรายการ ซึ่งหนึ่งในนั้นใช้เพื่อส่งคําขอไปยังบริการข้อมูลของ Google ได้ โปรดทราบว่าอาร์กิวเมนต์ข้อมูลที่ส่งผ่านด้วย curl ต้องเข้ารหัส URL หากประกอบด้วยอักขระที่ไม่ใช่ ASCII ซึ่งมักจะเป็นอาร์กิวเมนต์ Email และ Passwd คุณขอให้ curl เข้ารหัสอาร์กิวเมนต์เหล่านี้ได้โดยใช้แฟล็ก --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 ที่เฉพาะเจาะจงเกี่ยวกับพารามิเตอร์ที่ใช้ในคําขอด้านบน ในตัวอย่างนี้ บริการที่เราใช้คือ API ข้อมูลของ Picasa Web Albums ชื่อบริการ (service) คือ lh2 ดูชื่อบริการสําหรับบริการอื่นๆ ของ Google ได้ในหน้าคําถามที่พบบ่อยเกี่ยวกับ Google Data API

ค่าของโทเค็น 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"

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


การเรียกดูฟีดและรายการ

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

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

วิธีนี้จะแสดง BLOB ในรูปแบบที่ไม่ได้จัดรูปแบบ:

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

มีเครื่องมือบางอย่างที่เหมาะสําหรับการจัดรูปแบบเอาต์พุตนี้เพื่อให้อ่านได้ง่ายขึ้น รวมถึงเป็นระเบียบ วิธีที่ง่ายที่สุดในการจัดระเบียบคือการวางเอาต์พุตจากคําสั่ง curl ลงในการจัดระเบียบดังตัวอย่างต่อไปนี้

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. เรียกดูรายการโดยใช้ค่า URL atom:link/@rel='self'
  2. อัปเดตรายการในเครื่องเพื่อทําการเปลี่ยนแปลงที่จําเป็น
  3. PUT รายการกลับไปที่เซิร์ฟเวอร์ โดยใช้ค่า URL atom:link/@rel='edit'

1. กําลังเรียกดูรายการ

ทั้งนี้ ระบบจะเรียกรายการได้โดยใช้ URL 1 ใน 2 รายการที่เป็นตัวหนาในบล็อกฟีดด้านบน 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 การแก้ไข 1 รายการโดยใช้มือ tidy มักจะช่วยให้ทํางานกับ XML ได้ง่ายขึ้น

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

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

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

การดึงข้อมูล 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 Data ให้คุณวางองค์ประกอบ 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 อัปเดต ระบบจะใช้ 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"

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

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

ตัวอย่างด้านล่างแสดงวิธีอัปโหลดรูปภาพชื่อ sweeping_the_rock.png ไปยัง Picasa Web Album ที่มีชื่อว่า "การกวาดหิน"

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, opensl ใช้สําหรับสร้างการเชื่อมต่อแบบ Socket ดิบ (ข้อความธรรมดาและ SSL ตามลําดับ) ไปยังเว็บเซิร์ฟเวอร์และใช้โต้ตอบกับบริการข้อมูลของ Google ได้ โปรดทราบว่าบริการข้อมูล Google บางอย่างอาจไม่รองรับ SSL วิธีเปิดการเชื่อมต่อมีดังนี้
    • telnet picasaweb.google.com 80 (API ข้อมูล Picasa Web Albums)
    • openssl s_client -connect www.google.com:443 (API ข้อมูลของ Google ปฏิทินและบริการอื่นๆ ใน 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"
    
  • IdPtproc เป็นเครื่องมือเพื่อใช้การเปลี่ยนรูปแบบ XSL (XSLT) กับเอกสาร XML ซึ่งสามารถใช้เพื่อดึงข้อมูลที่ต้องการได้อย่างง่ายดายจากรายการ XML หรือฟีดที่ Google Data API แสดงผล หรือเพื่อสร้างรายการใหม่หรือที่อัปเดต

บทสรุป

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