שימוש ב-cURL לאינטראקציה עם שירותי הנתונים של Google

אזהרה: הדף הזה עוסק בממשקי API ישנים יותר של Google, ממשקי Google Data API. הוא רלוונטי רק לממשקי ה-API שרשומים בספריית Google Data API, שרבים מהם הוחלפו בממשקי API חדשים יותר. מידע על API חדש ספציפי מופיע במסמכי התיעוד של ה-API החדש. למידע על הרשאת בקשות באמצעות API חדש יותר, אפשר לעיין במאמר אימות והרשאה של חשבונות Google.

ריאן בויד, צוות Google Data APIs
ספטמבר 2007

מבוא

בבסיס, Google Data APIs משתמשים בפידים וברשומות של Atom (XML) כפורמט נתונים וב-HTTP כפרוטוקול להעברת נתונים – הרחבה של Atom Publishing Protocol. אנחנו מפרסמים מספר ספריות לקוח כדי להקל על האינטראקציה עם Google Data APIs. עם זאת, תמיד אפשר להשתמש בכלים ברמה נמוכה יותר כדי לעבוד עם השירותים שלנו, ודי קל לעשות את זה בעזרת הדרכה קצרה.

‫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

בקשות מאומתות לנתונים של Google מתבצעות על ידי הוספת כותרת HTTP לבקשה, שמכילה אסימון אימות מסוג ClientLogin (אפליקציות למחשב או לנייד) או AuthSub (אפליקציות אינטרנט). למטרות בדיקה באמצעות cURL, השיטה ClientLogin היא קלה יותר ומתועדת בהמשך. אפשר להשתמש בכותרות אימות של AuthSub עם cURL, אבל התהליך המתקדם יותר של קבלת האסימונים לא מתואר במאמר הזה.

שימוש ב-ClientLogin

השיטה ClientLogin מיועדת לאפליקציות מותקנות (למחשב או לנייד). בשיטת האימות הזו, האפליקציה שמשתמשת ב-Google Data APIs מטפלת ישירות בשם המשתמש ובסיסמה של המשתמש.

בקשת אימות ל-ClientLogin מקבלת שם משתמש, סיסמה ושם שירות כמשתני post בטופס. המשתנים האלה מועברים כארגומנטים Email,‏ Passwd ו-service, בהתאמה. התגובה לבקשה הזו כוללת כמה אסימונים, שאחד מהם יכול לשמש לשליחת בקשות לשירות הנתונים של Google. שימו לב: אם ארגומנטים של נתונים שמועברים באמצעות curl מכילים תווים שאינם ASCII, הם צריכים להיות בקידוד URL. תווים כאלה מופיעים לעיתים קרובות בארגומנטים 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, צריך להעביר ל-curl רק את כותרת האימות ואת כתובת ה-URL. בדוגמה שלמטה נמשיך להשתמש ב-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 APIs, צריך לבצע HTTP PUT לכתובת ה-URL של העריכה עם עותק חדש של ה-XML של הרשומה בגוף הבקשה.

  1. אחזור הרשומה באמצעות ערך כתובת ה-URL‏ atom:link/@rel='self'
  2. מעדכנים את הרשומה באופן מקומי כדי לבצע את השינויים הנדרשים
  3. PUT את הרשומה בחזרה לשרת, באמצעות ערך כתובת ה-URL atom:link/@rel='edit'

1. אחזור הרשומה

אפשר לאחזר את הרשומה באמצעות אחת משתי כתובות ה-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. עדכון הרשומה בשרת

באמצעות כתובת ה-URL של edit, צריך 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. שינוי רשומת התבנית

אנחנו רוצים ליצור אלבום בשם 'Curling in Canada' עם תמונות ממשחק הקרלינג האחרון שלנו. הכלי 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 PUT משתמשים בשיטה HTTP DELETE ולא צריך לשלוח נתונים. בדומה לבקשת העדכון, כתובת ה-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 היא היכולת להעלות אובייקטים בינאריים. אפשר להעלות נתונים בינאריים וכותרת slug בקלות באמצעות cURL. עם זאת, נכון לעכשיו, ה-API של נתוני רשימת המסמכים מחייב פרסום של ה-XML יחד עם הנתונים הבינאריים כהודעה מרובת חלקים בפורמט MIME. יצירת הודעה מרובת חלקים היא מעבר להיקף המאמר הזה.

בדוגמה הבאה מוצג איך להעלות תמונה בשם sweeping_the_rock.png לאלבום ב-Google Photos עם הכותרת '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 Data. שימו לב שלא כל שירותי הנתונים של 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 רשומה חדשה של אלבום ב-Google Photos:
    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 APIs, או כדי ליצור רשומות חדשות או מעודכנות.

סיכום

כפי שראיתם, אפשר להשתמש ב-cURL ובכמה כלים אחרים של שורת הפקודה כדי ליצור אינטראקציה בקלות עם שירותי הנתונים של Google באמצעות XML ו-HTTP גולמיים. אם יש לכם שאלות לגבי השימוש בכלים האלה עם Google Data API המועדף עליכם, אתם מוזמנים להצטרף לפורומים הספציפיים ל-API.