יום שלישי, 23 באפריל 2013

מה זה Rest? או Restful Service

מי שבעצם הגדיר את Rest או Representational State Transfer הוא Roy T. Fielding (היה מבין מעצבי פרוטוקול HTTP). הגדיר זאת כסגנון ארכיטקטוני- שזהו בעצם דרך אבסטרקטית לבטא את הרעיון מאחורי הארכיטקטורה. סגנון ארכיטקטוני מגדיר את המאפיינים של הארכיטקטורה שתשתמש בסגנון הנ"ל... (Client-Server זה סגנון ארכיטקטוני).
הוא עוד הוסיף ואמר ש Rest מנסה להביא למינימום את ה latency ואת התקשורת ברשת, ובאותו הזמן למקסם את יכולת הסקלביליות והעצמאות  של הרכיבים עצמם.
הרעיון המרכזי של Rest זה במקום להשתמש בצורות מסובכות (כמו SOAP,RPC) כדי לתקשר עם מערכת אחרת, נשתמש בבקשת HTTP  פשוטה כדי לבצע את התקשורת שדרושה לנו. (מכיוון שלרוב Rest ממומש על Http, כך אתייחס בבלוג..)


 מאפייני Rest חשובים :
  1. מיושם באריטקטורות client-server
  2. למרות ש Rest פותח במקביל ל Http1.1, אפשר לממש את הסגנון הארכיטקטוני Rest  לא רק על גבי Http.
  3. הContext של הפנייה הוא Stateless
  4. הוא Cacheable- כלומר ניתן לעשות caching של תשובות השרת בזיכרון של מחשב הלקוח

העקרון המרכזי ב Rest הוא לתת לכל משאב ID. ב Web יש רעיון עבור IDs שנקרא URI- שזהו namespace גלובלי, והשימוש בו מבטיח לתת לכל משאב ID ייחודי גלובלי (קחו למשל דוגמא כתובת של אתר אינטרנט...).

Rest משתמש ב Http עבור כל פעולות ה CRUD שהם (Create/Read/Update/Delete), אך כמובן שהוא לא נצמד אליהם ויכול להשתמש בפעולות שהם Non-CRUD

Create- זוהי מתודת ה PUT - כלומר הוספת משאב חדש למערכת
Read- זוהי מתודת ה GET - קבלת משאב מהמערכת
Upadte- זוהי מתודת ה POST- עדכון המשאב במערכת
Delete - מחיקת המשאב מהמערכת

ב Rest אנחנו ניגשים למשאב ולא לשירות. המשאבים שלנו צריכים להיות מוגדרים היטב.

לדוגמא ניקח את הסנריו הבא:

יש לנו משב לקוחות ומשאב הזמנות (של לקוחות). השרות שלנו חושף רק את הפונקציות שמצוינות להלן:


בואו נראה איך המבנה יראה על פי Rest:

המשאבים שלנו יצטרכו לממש את ה Interface שנגדיר (בתרשים הבא אני אציג רק את המטודות שהמשאב משתמש (לצורך פשטות), למרות שבפועל הוא צריך להכיל את כל המטודות מה interface)




בואו נאמר שאנחנו רוצים לקבל פרטים של order מסויים. ( או בעצם להפעיל את הפונקציה GetOrder)

אם נשתמש ב Web Service וב SOAP הבקשה תראה כך:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
 <soap:body pb="http://www.acme.com">
  <pb:GetOrder>
   <pb:OrderID>12345</pb:OrderID>
  </pb:GetOrder>
 </soap:Body>
</soap:Envelope>

וכנראה שגם יחזור לנו SOAP Response עם התשובה..

וע"י שימוש ב Rest הבקשה תיראה כך:

http://www.acme.com/Orders/12345

שתשלח לשרת ע"י בקשת HTTP GET,  ויחזור לי HTTP RESPONSE  עם התשובה.

למשל אם נרצה לקבל את כל הלקוחות:

http://www.acme.com/Customers

או למחוק לקוח מסויים (ע"י שליחת HTTP DELETE)

http://www.acme.com/Customers/1234

או לקבל את כל ההזמנות של לקוח מסויים:

http://www.acme.com/Customers/12345/Orders


אפשר גם לעשות שימוש בבקשות קצת יותר מורכבות:

http://www.acme.com/OrderDetails?ProductName=X&Year=2000

בד"כ בתשובה יחזור לי XML, אך בשונה מ SOAP, זה לא חייב להיות XML. זה יכול להיות גם JSOM,CSV

כלל חשוב שיש לשים לב זה שהגדרת ה URI מחייבת שתהיה אפשרות גישה לכל משאב בהיררכיות.
למשל: אם יש לי גישה ל
http://www.acme.com/Customers/12345/Orders

אז יהיה לי גישה גם ל:

http://www.acme.com/Customers/12345
http://www.acme.com/Customers

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

מתי נשתמש ב REST ומתי ב SOAP?
לזה נקדיש בהמשך פוסט נפרד..

תהנו!

אין תגובות:

הוסף רשומת תגובה