بروتوكول النفاذ إلى خدمة الوب
ساهم بشكل رئيسي في تحرير هذا الموضوع |
بروتوكول النفاذ إلى خدمات الوب 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>
المصادر
http://www.w3schools.com/soap/default.asp
http://www.alepposoft.net