بروتوكول النفاذ إلى خدمة الوب
إيمان دلعين ساهم بشكل رئيسي في تحرير هذا المقال
|
بروتوكول النفاذ إلى خدمات الوب SOAP اختصار لـ "Simple Object Access Protocol"، مبني على الـ XML يسمح للتطبيقات بتبادل المعطيات فوق بروتوكول الـ HTTP .يرمّز هذا البروتوكول رسائل (طلبات و ردود) خدمات الوب قبل أن ترسل عبر الشبكة، وهذه الرسائل مستقلة عن أي نظام تشغيل أو بروتوكول آخر، ويمكن أن تنقل عبر عدة بروتوكولات مثل : SMTP, MIME, HTTP.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
خصائص SOAP
- اختصار لـ Simple Object Access Protocol
- بروتوكول للاتصال بين التطبيقات
- صمم للتواصل عبر الانترنت
- يوفر بنية واحدة لنقل الرسائل بين التطبيقات
- بروتوكول مستقل عن بيئة العمل
- بروتوكول مستقل عن لغة البرمجة
- مبني على الـ XML
- بروتوكول بسيط وقابل للتوسع
- يسمح هذا البروتول بالالتفاف حول الجدران النارية Firewalls
- أحد توصيات الـ W3C
لماذا SOAP؟
يستخدم بروتوكول SOAP في تواصل تطبيقات الويب كبديل عن طريقة RPC (Remote Procedure Call)التي يتم حجبها في مخدمات الاتصال لأسباب امن المعلومات، وعليه تم بناء هذا البروتوكول كطبقة تستخدم بروتوكول HTTP المدعوم من قبل كافة أنواع المخدمات والمتصفحات، واستخدامه في تأمين التواصل بين تطبيقات تعمل ضمن بيئات عمل مختلفة.
بنية الـ SOAP:
بناء رسالة لـ SOAP
الهيكل الأساسي لرسالة 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:Header> ... </soap:Header> <soap:Body> ... <soap:Fault> ... </soap:Fault> </soap:Body> </soap:Envelope>
رسالة البروتوكول SOAP هي عبارة عن ملف XML مرتب يتضمن العناصر التالية:
عنصر التغليف
<?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"> ... Message information goes here ... </soap:Envelope>
ويعرِّف عنصر التغليف ملف الـ XML على أنه رسالة SOAP، ووجود هذا العنصر في الرسالة مطلوب بشكل أساسي لأنه العنصر المعرّف لرسالة SOAP، وهو الذي يحول ملف الـ XML إلى رسالة SOAP عن طريق الواصفة xmlns:soap والتي تملك القيمة التالية دائماً:
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
ويوجد في عنصر التغليف واصفة ثانية تدعى encodingStyle والتي تحدد أنماط المعطيات المستخدمة في المستند، وهذه الواصفة قد توجد في أي عنصر من عناصر SOAP، وتطبق على محتويات هذا العنصر وعلى العناصر الأبناء أيضاً.ولا تملك رسائل SOAP ترميز افتراضي، لذلك يعتبر ذكر نوع الترميز أساسياً أيضاً.
عنصر الترويسة
وهو عنصر يحوي معلومات محددة عن الرسالة وتهم التطبيق، كالشهادة الأمنية ومعلومات عن عمليات الدفع payment، يعتبر هذا العنصر اختياري ولكن في حال وجوده لا بد أن يكون الابن الأول لعنصر التغليف.
<?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:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:mustUnderstand="1">234 </m:Trans> </soap:Header> ... ... </soap:Envelope>
يمثل المثال السابق عنصر الترويسة والذي يحوي واصفات مثل الـ "Trans" ، وواصفة الـ "mustUnderstand" ذات القيم "1" و "234"
واصفات عنصر الترويسة
يعرف SOAP ثلاث واصفات خاصة بعنصر الترويسة داخل عنصر التغليف بشكل افتراضي وهي:
- actor
- mustUnderstand
- encodingStyle
والتي تحدد كيف سيعالج المستقبل رسالة SOAP.
الواصفة actor:
تمر رسالة 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:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:actor="http://www.w3schools.com/appml/">234 </m:Trans> </soap:Header> ... ... </soap:Envelope>
الواصفة mustUnderstand:
وتستخدم هذه الواصفة لتحدّد للمستقبل فيما اذا كانت معالجة عنصر الترويسة عملية اختيارية أو إجبارية، فإذا كانت قيمة هذه الواصفة هي "1" هذا يعني أن المستقبل مجبر على معالجة عنصر الترويسة.
<?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:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:mustUnderstand="1">234 </m:Trans> </soap:Header> ... ... </soap:Envelope>
الواصفة encodingStyle:
والتي تحدد أنماط المعطيات المستخدمة في المستند، وهذه الواصفة قد توجد في أي عنصر من عناصر SOAP، وتطبق على محتويات هذا العنصر وعلى العناصر الأبناء أيضاً. ولا تملك رسائل SOAP ترميز افتراضي.
عنصر جسم الرسالة
والذي يحوي معلومات الاستدعاء والاجابة، أي المعلومات الفعلية للرسالة. المثال التالي يطلب سعر التفاح عن طريق Getprice وهي ليست من عناصر 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> <m:GetPrice xmlns:m="http://www.w3schools.com/prices"> <m:Item>Apples</m:Item> </m:GetPrice> </soap:Body> </soap:Envelope>
وسيكون الرد على الطلب السابق شبيها بمايلي:
<?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> <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices"> <m:Price>1.90</m:Price> </m:GetPriceResponse> </soap:Body> </soap:Envelope>
عنصر الخطأ
وهو الذي يحمل معلومات حول الأخطاء التي حدثت أثناء معالجة الرسالة، ومعلومات عن حالة الرسالة، وهو عنصر اختياري. وفي حال وجوده يظهر كعنصر ابن لعنصر جسم الرسالة، ويجب أن يكون وحيد في الرسالة، أي كل رسالة تحمل على الأكثر عنصر خطأ واحد.
ولعنصر الخطأ عدة عناصر جزئية هي :
العنصر الجزئي | الوصف |
---|---|
<faultcode> | رمز لتحديد نوع الخطأ |
<faultstring> | شرح مفصل عن ماهية الخطأ، وهذا الشرح قابل للقراءة من قبل المستخدم |
<faultactor> | معلومات عن أسباب وقوع الخطأ |
<detail> | يحوي معلومات عن الخطأ وهذه المعلومات خاصة بالتطبيق ولها علاقة بجسم الرسالة |
رموز تحديد الخطأ :
رمز الخطأ | الوصف |
---|---|
VersionMismatch | أحد عناصر الـ SOAP يحمل قيمة خاطئة |
MustUnderstand | لم يتم معالجة ترويسة الرسالة، مع أن الواصفة mustUnderstand تحمل القيمة "1" |
Client | تم تشكيل الرسالة بشكل خاطئ، أو أن الرسالة تحوي على معلومات خاطئة |
Server | هناك مشكلة في المخدم، ولذلك لن تواصل الرسالة مرورها |
قواعد خاصة ببنية SOAP
- يجب ترميز الرسائل باستخدام الـ XML
- يجب أن تستخدم الرسائل الغلاف الخاص بـ SOAP وهو soap-envelope
- يجب أن تستخدم الرسائل الترميز الخاص بـ SOAP وهو soap-encoding
- يجب أن لا تحوي الرسائل على مرجع للـ DTD Document Type Definition
- يجب أن لا تحوي الرسائل على أي تعلمية من تعليمات معالجة الـ XML
ربط البروتوكول SOAP مع البروتوكول HTTP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
البروتوكول HTTP
يعمل هذا البروتوكول فوق الـ TCP/IP، حيث يقوم زبون الـ HTTP بالاتصال مع مخدم الـHTTP باستخدام الـ TCP، وبعد أن يتم الاتصال يستطيع الزبون أن يرسل للمخدم طلب من نوع HTTP:
POST /item HTTP/1.1 Host: 189.123.345.239 Content-Type: text/plain Content-Length: 200
وبعدها يعالج المخدم هذا الطلب ويرسل استجابة من نوع HTTP إلى الزبون، وتحوي هذه الاستجابة على رمز الحالة الذي يكشف حالة الطلب:
200 OK Content-Type: text/plain Content-Length: 200
في المثال السابق يرسل المخدم رمز الحالة وهو "200" إلى الزبون، والذي يعبر عن نجاح عملية استقبال الطلب ومعالجته، أما في حال كان هذا الرمز "400" فهو يعبر عن فشل في فك ترميز الطلب، أي أن المخدم لم يفهم الطلب:
400 Bad Request Content-Length: 0
ربط SOAP مع HTTP
توابع SOAP هي عبارة عن طلبات وردود من نمط HTTP، ولكن تتوافق مع قواعد ترميز SOAP، فيكون لدينا :
HTTP + XML = SOAP
علماً أن طلبات SOAP ممكن أن تكون إما من نوع HTTP POST أو من نوع HTTP GET.
ويحوي الطلب من نمط HTTP POST على الأقل ترويستين للـ HTTP هما: Content-Type ,Content-Length.
حيث تحدد ترويسة الـ Content-Type نمط الـ MIME الخاص بالرسالة، وتحدد أيضا نوع الترميز المستخدم لجسم الـXML سواءً بالطلب أو بالاستجابة، وبشكل اختياري:
Content-Type: MIMEType; charset=character-encoding
أما ترويسة Content-Length فتحدد عدد البايتات في كلٍ من جسم الطلب أو الاستجابة:
Content-Length: bytes
مثال:
POST /item HTTP/1.1 Content-Type: application/soap+xml; charset=utf-8 Content-Length: 250
مثال عن SOAP بشكل عام
الطلب
POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn ---------------------- <?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 xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> --------------------- </soap:Envelope>
الاستجابة
HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn ------------------------ <?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 xmlns:m="http://www.example.org/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> ---------------------- </soap:Envelope>