ענב הזעם – API

ברובי, הדבר הכי מוכר ביקום הוא framework בשם Rails, אשר מאפשר ליצור אתרים דינאמיים בצד השרת.

ישנם עוד מספר סוגי framework עבור עולם ה web, בהם Sinatra, שאני משתמש המון, ולאחרונה התחלתי לשחק גם עם framework מאוד מעניין שנקרא grape.

Grape הוא framework אשר נועד לתת לנו כלי לפיתוח API. זה אומר שכל הפיטצ'רים שלו הם על טהרת REST ואין שום דבר הקשור להצגת templates למשל בצד המשתמש.

כלומר ניתן להציג xml, json או כל מבנה אחר של מידע, אבל זה לא נועד ליצור אתר, אלא להחזיר מידע, או לבצע פעולות API.

הנה הדגמה קלה כיצד תראה תוכנית שכזו:

module POC
  class Example1 < Grape::API
    version 'v1'
    format :json

    desc 'Our root path'
    get '/' do
      { status: 400, message: 'Bad Request.'  }
    end

    desc 'List all files in current directory'
    get '/ls' do
      files = {}
      files[:files] = Dir[File.dirname(__FILE__) + '/**']
      files
    end

  end
end

יצרנו עכשיו סוג של API מבוסס JSON, אשר אומר שהמחלקה מקבלת path הנקרא v1.
אם ניגש ל root שלה כספרייה, אני מחזיר JSON שאומר שזה bad request (במקום להשתמש ב HTTP Status Code).
אם אני ניגש לפקודה בשם ls, כלומר: http://localhost:9292/v1/ls , אז אקבל את רשימת הקבצים והספריות מהמיקום הנוכחי שלי כלפי פנימה.

רגע, אבל לא עדיף לקבל HTTP 400 ?
אז אשנה את זה לצורה הבאה:

get '/' do
  error!({ status: 400, message: 'Bad Request.'  }, 400)
end

עכשיו עדיין המשתמש יקבל JSON אבל החזרה תהיה עם 400 במקום עם 200.

אבל עכשיו יש בעיה ! ls היא פקודה מאוד רגישה. אני רוצה להגן עליה שרק מישהו עם משתמש וסיסמה יוכל לקבל את הרשימה הזו.

class Example1 < Graph::API
   ...
   http_basic do |name, pass|
     {'admin' => 'admin'}[name] == pass
   end
   ...
end

אבל רגע, עכשיו כל v1 מוגן בסיסמה !

אפשר ליצור סוג של namespace מסוים, אשר דרכו ניתן יהיה להחליט מה יקבל סיסמה ומה לא:

class Example1 < Graph::API
   version 'v1'
   format :json

   get '/' do
     error!({status: 400, message: 'Bad Request.'}, 400)
   end

   namespace '/' do
     http_basic do |name, pass|
       {'admin' => 'admin'}[name] == pass
     end

     get 'ls' do
       files = {}
       files[:files] = Dir[File.dirname(__FILE__) + '/**']
       files
     end
  end
end

מושלם !

לחצו כאן להורדת כל הקוד.

לכלי גם מספר תכונות ממש חשובות, כדוגמת קביעת פרמטרים, ומה בעצם הם צריכים להכיל, האם הם חייבים להופיע או לא, קוד לביצוע סניטציה על המידע, וכיוב' …

הפוסט הזה אפילו לא מכסה את התחלת העבודה עם הכלי.

מה שחשוב בכלי הוא שהוא אינו באמת חייב לעמוד בריק. הוא יודע גם לעבוד במקביל מול Rails, סינטרה ולמעשה כל דבר אחר המדבר ב Rack על אותו שרת, ואפילו להשלים את ה framework.
יש לו הרבה תוספים, ובנוסף, לא חייבים לעבוד ב HTTP Authentication, אלא ניתן גם לתמוך ב OAuth2 למשל.

ממליץ בחום להתעסק איתו, ותגלו כי דברים שבסינטרה יקחו לכם אולי 15 דקות לכתיבה, כאן זה יהיה בין 3 ל5 דקות.

6 מחשבות על “ענב הזעם – API

  1. עודד

    נראה מוצר מעניין, אני אבדוק אותו. קצת חבל לי שיש פרמטר אחד שחובה להתחיל איתו את ה-URL שנקרא version – זה מונע מהמפתח את השליטה בפרמטרים של ה-URL.

    כמו כן, לעיתים רחוקות אני רוצה לממש את כל הקריאות של API מורכב במחלקה אחת – יש דרך לעשות קומפוזיציה – ז"א להכריז שמרחבי שמות מסוימים משורתים על ידי מחלקות אחרת?

    1. ik_5 מאת

      אתה לא חייב בדיוק, אתה יכול לשלוט בניתוב באמצעות מתודה בשם mount.
      הרעיון אבל של גרסאות די קוסם לי, כי כאשר יש צורך בשוני, אבל להשאיר את הישן, זה מאוד נוח.
      משהו שנפלתי בו מספר פעמים בפרויקטים, וזה היה פותר אותם.

  2. guss77

    ניסיתי, והאמת מגניב – אני הולך לכתוב ישום בעזרת הפלטפורמה. כמובן שרק API זה לא מספיק וצריך גם לקוח, וחוץ מזה – כפי שציינתי למעלה – אני בד"כ כותב API קצת יותר מורכבים ממה שנכנס בקובץ אחד בנוחות.

    אז בניתי תבנית קטנה מבוססת rackup שטוענת כמה מחלקות Grape ובנוסף משרתת קבצים סטטיים שיכולים להכיל לקוח שכתוב ב-HTML 5. ראה פה: https://github.com/guss77/grape-simple-app

    אני אשמח לשמוע את דעתך.

  3. פינגבק: גו – השלמתה של שפה | לראות שונה

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s