صابون XML
- SOAP تعني S imple O bject A ccess P rotocol
- SOAP هو بروتوكول اتصال تطبيقي
- SOAP هو تنسيق لإرسال الرسائل واستلامها
- SOAP هي منصة مستقلة
- يعتمد SOAP على XML
- SOAP هو توصية W3C
لماذا SOAP؟
من المهم لتطبيقات الويب أن تكون قادرة على الاتصال عبر الإنترنت.
أفضل طريقة للاتصال بين التطبيقات هي عبر HTTP ، لأن HTTP مدعوم من قبل جميع متصفحات الإنترنت والخوادم. تم إنشاء SOAP لإنجاز ذلك.
يوفر SOAP طريقة للتواصل بين التطبيقات التي تعمل على أنظمة تشغيل مختلفة بتقنيات ولغات برمجة مختلفة.
اللبنات SOAP
رسالة SOAP هي مستند XML عادي يحتوي على العناصر التالية:
- عنصر مغلف يعرف مستند XML كرسالة SOAP
- عنصر رأس يحتوي على معلومات الرأس
- عنصر أساسي يحتوي على معلومات الاتصال والاستجابة
- عنصر خطأ يحتوي على أخطاء ومعلومات الحالة
تم التصريح عن جميع العناصر أعلاه في مساحة الاسم الافتراضية لمغلف SOAP:
http://www.w3.org/2003/05/soap-envelope/
ومساحة الاسم الافتراضية لأنواع البيانات والترميز SOAP هي:
http://www.w3.org/2003/05/soap-encoding
قواعد النحو
فيما يلي بعض قواعد بناء الجملة المهمة:
- يجب تشفير رسالة SOAP باستخدام XML
- يجب أن تستخدم رسالة SOAP مساحة اسم مغلف SOAP
- يجب ألا تحتوي رسالة SOAP على مرجع DTD
- يجب ألا تحتوي رسالة SOAP على تعليمات معالجة XML
رسالة الهيكل العظمي SOAP
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
عنصر مغلف SOAP
عنصر مغلف SOAP المطلوب هو العنصر الجذر لرسالة SOAP. يعرّف هذا العنصر مستند XML كرسالة SOAP.
مثال
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
xmlns: مساحة اسم الصابون
لاحظ مساحة الاسم xmlns: soap في المثال أعلاه. يجب أن يكون دائمًا بالقيمة: "http://www.w3.org/2003/05/soap-envelope/".
تعرف مساحة الاسم Envelope على أنها SOAP Envelope.
إذا تم استخدام مساحة اسم مختلفة ، يقوم التطبيق بإنشاء خطأ ويتجاهل الرسالة.
السمة encodingStyle
تُستخدم سمة encodingStyle لتحديد أنواع البيانات المستخدمة في المستند. قد تظهر هذه السمة على أي عنصر SOAP ، وتنطبق على محتويات العنصر وجميع العناصر الفرعية.
لا تحتوي رسالة SOAP على تشفير افتراضي.
بناء الجملة
soap:encodingStyle="URI"
مثال
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
عنصر رأس SOAP
يحتوي عنصر رأس SOAP الاختياري على معلومات خاصة بالتطبيق (مثل المصادقة والدفع وما إلى ذلك) حول رسالة SOAP.
إذا كان عنصر الرأس موجودًا ، فيجب أن يكون أول عنصر فرعي لعنصر المغلف.
ملاحظة: يجب أن تكون جميع العناصر الفرعية المباشرة لعنصر الرأس مؤهلة لمساحة الاسم.
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
يحتوي المثال أعلاه على رأس يحتوي على عنصر "Trans" وسمة "mustUnderstand" بقيمة 1 وقيمة 234.
يحدد SOAP ثلاث سمات في مساحة الاسم الافتراضية. هذه السمات هي: mustUnderstand والممثل و encodingStyle.
تحدد السمات المحددة في رأس SOAP كيف يجب على المستلم معالجة رسالة SOAP.
يجب فهم السمة
يمكن استخدام سمة SOAP mustUnderstand للإشارة إلى ما إذا كان إدخال الرأس إلزاميًا أم اختياريًا لكي يقوم المستلم بمعالجته.
إذا قمت بإضافة mustUnderstand = "1" إلى عنصر فرعي لعنصر Header ، فهذا يشير إلى أن جهاز الاستقبال الذي يعالج الرأس يجب أن يتعرف على العنصر. إذا لم يتعرف جهاز الاستقبال على العنصر ، فسوف يفشل عند معالجة الرأس.
بناء الجملة
soap:mustUnderstand="0|1"
مثال
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
سمة الممثل
قد تنتقل رسالة SOAP من المرسل إلى المستقبل عن طريق تمرير نقاط نهاية مختلفة على طول مسار الرسالة. ومع ذلك ، قد لا تكون جميع أجزاء رسالة SOAP مخصصة لنقطة النهاية النهائية ، وبدلاً من ذلك ، قد تكون مخصصة لواحدة أو أكثر من نقاط النهاية على مسار الرسالة.
يتم استخدام سمة ممثل SOAP لمعالجة عنصر الرأس إلى نقطة نهاية محددة.
بناء الجملة
soap:actor="URI"
مثال
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:actor="https://www.w3schools.com/code/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
السمة encodingStyle
تُستخدم سمة encodingStyle لتحديد أنواع البيانات المستخدمة في المستند. قد تظهر هذه السمة على أي عنصر SOAP ، وستنطبق على محتويات هذا العنصر وجميع العناصر الفرعية.
لا تحتوي رسالة SOAP على تشفير افتراضي.
بناء الجملة
soap:encodingStyle="URI"
عنصر SOAP Body
يحتوي عنصر SOAP Body المطلوب على رسالة SOAP الفعلية المخصصة لنقطة النهاية النهائية للرسالة.
قد تكون العناصر الفرعية المباشرة لعنصر SOAP Body مؤهلة لمساحة الاسم.
مثال
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="https://www.w3schools.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
المثال أعلاه يطلب سعر التفاح. لاحظ أن m: GetPrice وعناصر العنصر أعلاه هي عناصر خاصة بالتطبيق. فهي ليست جزءًا من مساحة اسم SOAP.
يمكن أن تبدو استجابة SOAP كما يلي:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
عنصر خطأ SOAP
يُستخدم عنصر SOAP Fault الاختياري للإشارة إلى رسائل الخطأ.
يحتفظ عنصر خطأ SOAP بالأخطاء ومعلومات الحالة لرسالة SOAP.
في حالة وجود عنصر خطأ ، يجب أن يظهر كعنصر فرعي لعنصر النص. يمكن أن يظهر عنصر الخطأ مرة واحدة فقط في رسالة SOAP.
يحتوي عنصر خطأ SOAP على العناصر الفرعية التالية:
Sub Element | Description |
---|---|
<faultcode> | A code for identifying the fault |
<faultstring> | A human readable explanation of the fault |
<faultactor> | Information about who caused the fault to happen |
<detail> |
Holds application specific error information related to the Body element |
رموز خطأ SOAP
يجب استخدام قيم رمز الخطأ المحددة أدناه في عنصر رمز الخطأ عند وصف العيوب:
Error | Description |
---|---|
VersionMismatch | Found an invalid namespace for the SOAP Envelope element |
MustUnderstand | An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood |
Client | The message was incorrectly formed or contained incorrect information |
Server | There was a problem with the server so the message could not proceed |
بروتوكول HTTP
يتصل HTTP عبر TCP / IP. يتصل عميل HTTP بخادم HTTP باستخدام TCP. بعد إنشاء اتصال ، يمكن للعميل إرسال رسالة طلب HTTP إلى الخادم:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
يقوم الخادم بعد ذلك بمعالجة الطلب وإرسال استجابة HTTP إلى العميل. تحتوي الاستجابة على رمز الحالة الذي يشير إلى حالة الطلب:
200 OK
Content-Type: text/plain
Content-Length: 200
في المثال أعلاه ، عرض الخادم رمز الحالة 200. هذا هو رمز النجاح القياسي لـ HTTP.
إذا لم يتمكن الخادم من فك ترميز الطلب ، فربما يكون قد أرجع شيئًا كالتالي:
400 Bad Request
Content-Length: 0
تجليد الصابون
تحدد مواصفات SOAP بنية رسائل SOAP ، وليس كيفية تبادلها. يتم سد هذه الفجوة بما يسمى "روابط SOAP". روابط SOAP هي آليات تسمح بتبادل رسائل SOAP بفاعلية باستخدام بروتوكول النقل.
توفر معظم تطبيقات SOAP عمليات ربط لبروتوكولات النقل الشائعة ، مثل HTTP أو SMTP.
HTTP متزامن ويستخدم على نطاق واسع. يحدد طلب SOAP HTTP رأسي HTTP على الأقل: نوع المحتوى وطول المحتوى.
SMTP غير متزامن ويتم استخدامه في الملاذ الأخير أو في حالات معينة.
عادةً ما توفر تطبيقات Java لـ SOAP ارتباطًا محددًا لبروتوكول JMS (Java Messaging System).
نوع المحتوى
يحدد رأس نوع المحتوى لطلب واستجابة SOAP نوع MIME للرسالة وترميز الأحرف (اختياري) المستخدم في نص XML للطلب أو الاستجابة.
بناء الجملة
Content-Type: MIMEType; charset=character-encoding
مثال
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
طول المحتوى
يحدد رأس طول المحتوى لطلب واستجابة SOAP عدد البايت في نص الطلب أو الاستجابة.
بناء الجملة
Content-Length: bytes
مثال
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
مثال على الصابون
في المثال أدناه ، يتم إرسال طلب GetStockPrice إلى الخادم. يحتوي الطلب على معلمة StockName ومعلمة Price التي سيتم إرجاعها في الاستجابة. يتم تحديد مساحة اسم الوظيفة في "http://www.example.org/stock".
طلب 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/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
استجابة SOAP:
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/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/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>