SOAP - Simple Object Access Protocol
מי שהסתובב לאחרונה באתר של מיקרוסופט, וודאי הבחין בפרסום נרחב של האסטרטגייה החדשה שלהם-אסטרטגיית הדוט נט. במסגרת אסטרטגיה זו, מתכננת מיקרוסופט להפוך את עולם התכנות לעולם אחר לגמרי: מכונות שונות יוכלו לתקשר באותה שפה, קודים בשפות תכנות שונות יפעלו יחדיו(לא ממש יחדיו...) לאחר שתתקין תוכנה על המחשב, תוכל להסירה בצורה כזו שכאילו היא לא הייתה קיימת לפני זה, ועוד אפשרויות מתקדמות...
אחד מהכלים החשובים שלקחה על עצמה מייקרוסופט היה פרוטוקול ה-SOAP אשר מאפשר ליצור קריאות בין מכונות שונות ללא בעיה. המטרה העיקרית של SOAP היא לא רק ליצור קישור בין הרכיבים, אלא להגיע למצב בו יוכלו כל מכשירי הבית כמו טלויזיה, מקרר, מכונית, רדיו, דיסקמן לעבוד ביחד. עד היום, דבר כזה היה כמעט בלתי אפשרי, מכיוון שכל מכונה כזו "מדברת" בשפה שונה ואם נשלח בתיאוריה משתנה מהדיסקמן לטלויזיה, היא לא תבין אותו כי שניהם עובדים אחרת.
עם SOAP הבעיה כמעט נפטרת, הקריאות בSOAP הן לא מסוג מסויים אלא בפורמט טקסט XML, מה שמאפשר קריאה של הקוד ללא תלות בסוג המכונה כי המכונה בעצמה תפרש את הקוד לסוג המתאים לה.
בינתיים, SOAP נמצא ברמה התחלתית ולא באמת משמש לקריאות בין מכשירים שונים, אך כעת נעשה בו שימוש נרחב בקריאות בין רכיבים שנמצאים על שרתים שונים.
הייתרונות של SOAP על הדרכים האחרות לביצוע הקריאות הן:
* אי תלות בסוג המכונה ומערכת ההפעלה- הדבר ביחיד שצריך
כדי לקרוא לרכיב COM שנמצא על שרת אחר בעזרת SOAP הוא שהשרת בו נמצא הרכיב, מבין
את תכולת מעטפת ה-SOAP ,ה-XML.
* אי תלות בשפת התכנות- הקריאות יכולות להתבצע דרך שפות תכנות שונות, כל עוד יש להן תמיכה ב-SOAP
* מעבר דרך שרתי הגנה- SOAP שלא כמו קריאות הRMI והDCOM, עובד על גבי פרוטוקולים מהרמה הגבוהה כמו XML,HTTP,SMTP ולכן הודעות של
SOAP יכולות לעבור ביתר קלות דרך FIREWALLS.(כידוע בוודאי, שרתי ה-FIREWALLS לא מאפשרים פתיחת גישה של פרוטוקולים בסיסיים כמו TCP/IP או UDP)
לאילו מטרות כדאי להשתמש ב-SOAP?
להרבה מטרות:
* אם לדוגמה אתם עובדים בארגון מסויים, והארגון הזה שותף של עוד כמה ארגונים אחרים, תוכלו לשתף משאבים ומידע ביחד עם הארגונים המקושרים אליך.
* שימוש נוסף יכול להיות אם אתה בונה יישום מסחר אלקטרוני, ורוצה להוסיף לו מנוע השוואת מחירים, תוכל לעשות זאת בשתי דרכים:
-להתחבר עם SOAP לשרת של WWW.4SALE.CO.IL לדוגמא וליצור שם קשר עם הרכיב שאחראי על השוואת המחירים, וכך לקבל ממנו את התוצאות...
-לעומת זאת, אם אתה רוצה ליצור מנוע כזה בעצמך, תצטרך ליצור קשר בעזרת SOAP לרכיב שבחנויות הרשת שאליהן אתה רוצה להתקשר ואז, הרכיב הזה מכיל קישור למסד הנתונים ויודע לעשות לקחת את מחיר המוצר המבוקש ולשלוח אותו אל הרכיב שלך שיצר עימו את הקשר, כאשר מגיעות התוצאות לרכיב שלך, תוכל לעבד אותם וליצור השוואות..
איך עובדים עם SOAP?
כאמור, קריאות SOAP מתבצעות על גבי הפרוטוקולים מהרמה הגבוהה, אני אתמקד כאן בשליחת הודעות SOAP על גבי פרוטוקול ה-HTTP כיוון ששימוש זה צבר את התאוצה הרבה ביותר, הרבה יותר מאשר שימוש ב-SOAP על גבי פרוטוקול העברת הדואר-SMTP.
מדי פעם אני אשלב כאן דוגמאות ב-JAVA אבל למי שלא יודע JAVA, זה בכל זאת לא כל כך קשה להבנה.
נניח שיצרתי פונקציה בJAVA שצריכה לקבל מחרוזת של שם משתמש והיא מוסיפה לה את המילה"ברוך הבא".
לאחר מכן, אני יכול להשתמש בפונקציה מתוך ממשק שהגדרתו היא ציבורית:
public interface Hello{
public string sayhelloto(string name);
}
בדוגמא זו ניתן לראות שניגשים לפונקציה SAYHELLOWTO ומעבירים לה פרמטר של שם מסוג מחרוזת.
כעת, בואו נחשוב איך אני יכול להעניק משתנה לפונקציה בעזרת XML:
yitzik
שם הממשק הוכנס לתג הראשי (ROOT NODE) ומתחתיו נמצאים בהירארכיה שם הפונקציה והפרמטר שלה.
כעת, נשאר לנו לעטוף את מידע ה-XML הזה ולשלוח אותו באמצעות HTTP, אך לפני שאסביר איך עושים את זה, אתן לכם דוגמא למחרוזת שתחזור אחרי ששלחנו את הפרמטרים לפונקציה:
hi,yitzik, welcome
ניתן להבחין בקלות שלאחר שם הפונקציה, התווספה לי המחרוזת RESPONSE המציינת שזהו פלט ולא קריאה.
המבנה של מעטפות ה-SOAP:
כאמור, מידע ה-XML נשלח בתוך מעטפות SOAP ואלה נשלחות בתוך כותרות ה-HTTP,
אם נכניס את מידע ה-XML מהדוגמא האחרונה, נקבל את ה"קוד" הבא:
yitzik
וכמובן מעטפת הפלט:
hi,yitzik ,welcome
אם זה נראה לכם קצת מורכב, אל תיבהלו, אני אסביר את הכל:
בתור התחלה אנו פותחים את הקוד עם SOAP-ENV:ENVELOPE, אשר מצביע על כך שפתחנו מעטפת SOAP חדשה. אחר כך אנו מוצאים כל מיני URLים.
אלו הם כתובות סטנדרטיות לכל מעטפת SOAP ואם שמתם לב, הם נמצאות בתוך XMLNS שהוא קיצור של XML NAME SPACE אנו מגדירים את שם הNS ונותנים לו את הערך(במקרה זה הURL).ה-NS בא להגיד לנו בדיוק למה אנו מתכוונים בעת תאור התג, לדוגמא, אם יש לנו שני תגי XML ולשניהם קוראים TITLE, אז בפעם אחת יכול להיות שהתכוונו לכותרת ספר מסויים ובשני התכוונו לתיאורו, המחשב לא יוכל להבדיל בין שני התגים כי אין לו אינטיליגנציה מספיקה בשביל זה ולאכן אנו מכניסים NS כדי להבדיל ביניהם.
נחזור להסבר, לאחר הגדרת ה-NS והמעטפה, אנו עוברים להגדיר את כותרת המעטפה על ידי תגי ה אשר משמשים לרוב להעברת מידע כמו למשל ID או לציון תוכן מוצפן(על הצפנה נדבר בהמשך). לאחר הHEADER נמצא תג ה-BODY שבו מוגדר NS שמכיל את שם הפונקציה ועוד NS שמכיל את שם הממשק. בדוגמא זו גם הוספתי לתג הBODY את סוג הקידוד שמכיל URL אל סכמה של קידוד מסויים על ידי ENCONDING TAG. אחר כך יש תג שמכיל את המחרוזת שרוצים לשלוח אל הפונקציה ובתוך תג זה גם מציינים שהפרמטר הוא מסוג מחרוזת. מייד אחר כך סוגרים את הקריאה לפונקציה, את גוף ההודעה, ואת המעטפה עצמה.
במידה והקריאה לפונקציה לא התבצעה בהצלחה, יחזיר השרת את המעטפה הבאה:
SOAP-ENV:Server
Server Error
i can not say hellow!!!
1001
את מה שנמצא בתוך תג ה-MESSAGE, כותב השרת על סמך תיאור ההודעה שאני כתבתי לו שיצור במקרה כזה.
איך שולחים את הודעות ה-SOAP:
כאמור, המעטפות נשלחות (במקרה שלנו) על גבי פרוטוקול ה-HTTP, אם נכניס את הדוגמא הקודמת באופן מלאכותי לתוך כותרת HTTP נקבל את ה-"קוד" הבא:
POST http://www.plupi.co.il/mysamp HTTP/1.0
Content-Type: text/xml; charset="utf-8"
Content-Length: 587
SOAPAction: "http://www.plupi.co.il/mysamp#sayHelloTo"
yitzik
וכמובן גם הפלט:
HTTP/1.0 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: 615
hi, yitzik,welcome
אם התנסיתם פעם בעבודה עם HTTP בוודאי תכירו את מבנה הקריאה, אך בינתיים הוא לא ממש חשוב, שכן, אובייקט הSOAP שעל השרת מחולל את כותרות ה-HTTP באופן אוטומאטי לאחר פקודת ה-SEND.
זה הכל להפעם, בינתיים ניסיתי לתת לכם מושג מה זה SOAP, אולי אני אכתוב בקרוב עוד מאמר על אבטחת המידע בSOAP ואיך בדיוק שולחים את המידע בין השרתים, אבל עד שזה יקרה, תצטרכו לחכות בסבלנות...
ביי ובהצלחה!!
|