SOAP (XML SOAP)
در این صفحه با پروتکل SOAP آشنا می شوی. «پروتکل (Protocol)» یعنی قوانین گفتگو. SOAP پیام ها را با XML می سازد. سپس بین برنامه ها جابجا می کند. این یعنی سازگاری بین سیستم های مختلف.
چرا SOAP مهم است؟
برنامه ها باید حرف بزنند. HTTP تقریباً همه جا هست. بنابراین، SOAP روی HTTP سوار می شود. سپس بین سیستم ها پیام امن و استاندارد جابجا می کند.
آجرهای پیام SOAP
- Envelope: کل پیام را قاب می کند.
- Header: اطلاعات اضافی مثل احراز هویت.
- Body: درخواست و پاسخ اصلی.
- Fault: خطا و وضعیت اجرای پیام.
نام فضای Envelope باید http://www.w3.org/2003/05/soap-envelope باشد. نام فضای encoding هم http://www.w3.org/2003/05/soap-encoding است.
قوانین نحوی مهم
- پیام باید XML باشد.
- باید نام فضای Envelope را داشته باشد.
- نباید DTD داشته باشد.
- نباید دستورهای پردازشی 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>
Envelope و encodingStyle
Envelope ریشه پیام است. encodingStyle نوع های داده را مشخص می کند. پیش فرضی وجود ندارد. مقدار آن یک URI است.
soap:encodingStyle="URI"
Header و mustUnderstand
Header اختیاری است. اما اگر بیاید، اولین فرزند Envelope است. ویژگی mustUnderstand می گوید این سرتیتر الزامی است یا نه.
<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>
actor برای نشانه گذاری گیرنده میانی
گاهی پیام از چند ایستگاه عبور می کند. ویژگی actor مشخص می کند کدام ایستگاه مخاطب این هدر است.
soap:actor="URI"
Body: محل درخواست و پاسخ
Body پیام واقعی را دارد. عناصر داخل آن می توانند نام فضا داشته باشند.
<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>
Fault: گزارش خطا و وضعیت
Fault داخل Body می آید و فقط یک بار مجاز است. زیرالمان های مهم: faultcode، faultstring، faultactor، detail.
| کد خطا | توضیح |
|---|---|
| VersionMismatch | نام فضای Envelope معتبر نیست. |
| MustUnderstand | هدر ضروری شناخته نشد. |
| Client | پیام بد ساخته شده است. |
| Server | مشکل سمت سرور رخ داده است. |
نمونه کامل درخواست و پاسخ
درخواست قیمت سهام ارسال می شود. پاسخ قیمت را برمی گرداند.
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>
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>
گام های عملی شروع با SOAP
- Envelope را با نام فضای درست بساز.
- Header را در صورت نیاز اضافه کن.
- Body را با داده دامنه پر کن.
- در صورت خطا از Fault استفاده کن.
نکته: برای مسیر کامل، اول WSDL را ببین. سپس صفحه RDF را مرور کن. همچنین، از این لینک برای تمرکز کلیدواژه استفاده کن: پروتکل SOAP.
جمع بندی سریع
- Envelope قاب پیام است.
- Header برای فراداده پیام است.
- Body حامل درخواست و پاسخ است.
- Fault خطا را استاندارد گزارش می کند.
- نام فضاهای SOAP بسیار مهم هستند.
منبع W3Schools را برای جزئیات ببین.