بروتوكول النفاذ إلى خدمة الوب

(تم التحويل من SOAP)
إيمان دلعين
ساهم بشكل رئيسي في تحرير هذا المقال

بروتوكول النفاذ إلى خدمات الوب 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

الكلمات الدالة: