البرمجيات في هذه الأيام أقوى من أي وقت مضى. يمكنهم تقديم الكثير من المعلومات والوظائف للمستخدمين. مع تزايد قدرات التطبيقات، هل تساءلت كيف يمكن تحقيق كل ذلك؟
أحد أنواع الملفات التي تظهر غالبًا في مجال تطوير التطبيقات هو ملف WSDL، ولكن ما هو؟
ما هو ملف WSDL؟
WSDL (لغة وصف خدمات الويب) تسمح للتطبيقات المختلفة بالتواصل مع بعضها البعض عبر الشبكة بطريقة موحدة. إنه يربط بين موفري خدمات الويب والمستهلكين، مما يسمح بتبادل البيانات بين الطرفين، وليس مقتصرًا عليهم.
تشتهر ملفات WSDL أيضًا بتوفير أوصاف وفيرة بشأن قدرات خدمة الويب، خاصةً لخدمات الويب المعتمدة على SOAP. تكتب ملفات WSDL بلغة XML (لغة ترميز ممتدة) وهي حيوية لاختبار واجهات برمجة التطبيقات SOAP.
أمر أكثر أهمية، تعتبر ملفات WSDL مهمة بسبب تعريف اتفاق رسمي بين موفر خدمة الويب ومستهلك الخدمة. توضح ملفات WSDL ما هي العمليات المتاحة، والتنسيق وهيكل الرسائل، وغيرها من التفاصيل المهمة المطلوبة عند استخدام خدمة الويب.
هيكل ملفات WSDL مع أمثلة
تحتوي ملفات WSDL على مكونات رئيسية توفر معلومات لاستخدامها. ستعرض هذه المقالة أجزاء من ملف WSDL بلغة XML، باستخدام خدمة ويب للأرصاد الجوية كمثال.
الأنواع type
يستخدم قسم type في ملفات WSDL لتعريف أنواع البيانات التي ستستخدم في عمليات خدمة الويب.
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/weather">
<element name="City" type="string"/>
<element name="Weather" type="string"/>
</schema>
</types>يوضح هذا المثال هيكل العناصر، بما في ذلك أسمائها City و Weather كونها من نوع string.
الرسالة message
يحدد قسم message عناصر البيانات التي يتم تبادلها بين موفر خدمة الويب ومستخدم الخدمة. في الأمثلة أعلاه، يمكنك رؤية أسماء الرسائل GetWeatherRequest و GetWeatherResponse.
<message name="GetWeatherRequest">
<part name="City" element="tns:City"/>
</message>
<message name="GetWeatherResponse">
<part name="Weather" element="tns:Weather"/>
</message>هنا، يتم تحديد رسائل GetWeatherRequest و GetWeatherResponse مع جزء يحدد عناصر البيانات التي يتم إرسالها أو استلامها.
نوع المنفذ portType
يصف قسم portType مجموعة من العمليات التي يمكن تنفيذها بواسطة خدمة الويب، مثل اسم العملية GetWeather. يحدد الواجهة المجردة للخدمة، مع قائمة بالعمليات جنبًا إلى جنب مع إدخالها tns:GetWeatherRequest ورسائل إخراجها tns:GetWeatherResponse.
<portType name="WeatherServicePortType">
<operation name="GetWeather">
<input message="tns:GetWeatherRequest"/>
<output message="tns:GetWeatherResponse"/>
</operation>
</portType>يوضح المثال أعلاه WeatherServicePortType عملية محددة GetWeather مع رسائل إدخال وإخراج محددة.
التوثيق binding
يحدد قسم binding كيفية ربط العمليات المجردة المحددة في portType ببروتوكول ملموس للتواصل. يحدد التفاصيل مثل تنسيق الرسالة والبروتوكول (مثل SOAP).
<binding name="WeatherServiceSoapBinding" type="tns:WeatherServicePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetWeather">
<soap:operation soapAction="http://example.com/weather/GetWeather"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>في هذا المثال، يتم تحديد WeatherServiceSoapBinding باستخدام SOAP كبروتوكول ربط، ويحدد تفاصيل حول تنسيق الرسالة والنقل.
المنفذ port
يحدد قسم port عنوان الشبكة حيث يمكن الوصول إلى خدمة الويب.
<service name="WeatherService">
<port name="WeatherServicePort" binding="tns:WeatherServiceSoapBinding">
<soap:address location="http://example.com/weather/service"/>
</port>
</service>هنا، يتم تعريف WeatherService مع WeatherServicePort الذي يستخدم ربط SOAP، وعنوانه محدد كما هو موضح في http://example.com/weather/service.
أمثلة على ملفات WSDL
مثال بسيط على ملف WSDL لخدمة الأرصاد الجوية
من خلال تجميع مقتطفات الأكواد المختلفة المكونة الرئيسية المقدمة في القسم السابق، يمكننا دمجها معًا وإنشاء ملف WSDL بسيط لخدمة الأرصاد الجوية.
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://example.com/weather"
targetNamespace="http://example.com/weather">
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/weather">
<element name="City" type="string"/>
<element name="Weather" type="string"/>
</schema>
</types>
<message name="GetWeatherRequest">
<part name="City" element="tns:City"/>
</message>
<message name="GetWeatherResponse">
<part name="Weather" element="tns:Weather"/>
</message>
<portType name="WeatherServicePortType">
<operation name="GetWeather">
<input message="tns:GetWeatherRequest"/>
<output message="tns:GetWeatherResponse"/>
</operation>
</portType>
<binding name="WeatherServiceSoapBinding" type="tns:WeatherServicePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetWeather">
<soap:operation soapAction="http://example.com/weather/GetWeather"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="WeatherService">
<port name="WeatherServicePort" binding="tns:WeatherServiceSoapBinding">
<soap:address location="http://example.com/weather/service"/>
</port>
</service>
</definitions>في هذا المثال البسيط لخدمة الأرصاد الجوية، يمكن ملاحظة ما يلي:
- تعمل خدمة الويب تحت namespace
http://example.com/weather. - تحدد نوعي بيانات بسيطين:
CityوWeather. - هناك رسالتان،
GetWeatherRequestوGetWeatherResponse، تحدد البيانات المدخلة والمخرجة لعمليةGetWeather. - تحدد نوع منفذ
WeatherServicePortTypeعمليةGetWeather. - يشير
WeatherServiceSoapBindingإلى أن التواصل سيستخدم SOAP مع نمط ونقل معين. - تحتوي الخدمة
WeatherServiceعلى منفذ يسمىWeatherServicePortيستخدم ربط SOAP، وعنوانه محدد كالتالي:http://example.com/weather/service.
مثال معقد على ملف WSDL لخدمة التجارة الإلكترونية
إليك مثال أكثر تعقيدًا لملف WSDL لخدمة التجارة الإلكترونية يتضمن عمليات متعددة، وأنواع بيانات، وميزات.
?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://example.com/ecommerce"
targetNamespace="http://example.com/ecommerce">
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/ecommerce">
<element name="Product">
<complexType>
<sequence>
<element name="ProductId" type="string"/>
<element name="ProductName" type="string"/>
<element name="Price" type="decimal"/>
</sequence>
</complexType>
</element>
<element name="Order">
<complexType>
<sequence>
<element name="OrderId" type="string"/>
<element name="CustomerName" type="string"/>
<element name="Products" type="tns:Product" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
</schema>
</types>
<message name="GetProductRequest">
<part name="ProductId" element="tns:ProductId"/>
</message>
<message name="GetProductResponse">
<part name="Product" element="tns:Product"/>
</message>
<message name="PlaceOrderRequest">
<part name="Order" element="tns:Order"/>
</message>
<message name="PlaceOrderResponse">
<part name="Confirmation" type="string"/>
</message>
<portType name="ECommerceServicePortType">
<operation name="GetProduct">
<input message="tns:GetProductRequest"/>
<output message="tns:GetProductResponse"/>
</operation>
<operation name="PlaceOrder">
<input message="tns:PlaceOrderRequest"/>
<output message="tns:PlaceOrderResponse"/>
</operation>
</portType>
<binding name="ECommerceServiceSoapBinding" type="tns:ECommerceServicePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetProduct">
<soap:operation soapAction="http://example.com/ecommerce/GetProduct"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="PlaceOrder">
<soap:operation soapAction="http://example.com/ecommerce/PlaceOrder"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="ECommerceService">
<port name="ECommerceServicePort" binding="tns:ECommerceServiceSoapBinding">
<soap:address location="http://example.com/ecommerce/service"/>
</port>
</service>
</definitions>في هذا المثال المعقد لخدمة التجارة الإلكترونية، يمكن ملاحظة ما يلي:
- تم تعريف أنواع البيانات المعقدة
ProductوOrderمع عناصر متداخلة (مثلProductIDوProductNameوPrice) وتسلسلات. - تم تعريف عمليات متعددة
GetProductوPlaceOrderضمنECommerceServicePortType. - تم تعريف الرسائل
GetProductRequestوGetProductResponseوPlaceOrderRequestوPlaceOrderResponseلكل عملية، تحدد البيانات المدخلة والمخرجة. - يشير ربط SOAP
ECommerceServiceSoapBindingإلى تفاصيل التنسيق للتواصل باستخدام SOAP. - تحتوي الخدمة
ECommerceServiceعلى منفذ يسمىECommerceServicePortيستخدم ربط SOAP، وعنوانه محدد كالتالي:http://example.com/ecommerce/service.
تحرير ملفات WSDL باستخدام Apidog
نظرًا لأن ملفات WSDL شائعة نسبيًا في مجال تطوير البرمجيات، قد تحتاج إلى تعديل أو إنشاء واحدة بنفسك. مع العديد من منصات واجهات برمجة التطبيقات المتاحة، يُعتبر Apidog خيارًا ممتازًا.
يسمح Apidog للمطورين وموفري خدمات الويب ومستخدمي خدمات الويب من أي خلفية بإجراء انتقال سلس من منصات واجهات برمجة التطبيقات الأخرى إلى Apidog.
لحسن الحظ، يغطي Apidog أيضًا استيراد ملفات WSDL! إذا كنت مهتمًا بتجربته، تأكد من تحميل Apidog باستخدام الأزرار أدناه.
لا تنس تسجيل الدخول وبدء مشروع جديد بمجرد دخولك. إذا كنت بحاجة إلى المساعدة، تحقق من وثائق مساعدة Apidog.
استيراد واجهة برمجة التطبيقات SOAP الخاصة بك إلى Apidog من ملف WSDL

بمجرد فتح مشروع جديد، انقر على زر "الإعدادات" الموجود على الشريط الجانبي العمودي الموجود على الجانب الأيسر من نافذة Apidog. ثم، انقر على السهم 2 والسهم 3 بهذا الترتيب.
اختبار واجهة برمجة التطبيقات SOAP بسهولة على Apidog

إذا كنت قد استوردت ملف WSDL بنجاح، يجب أن ترى اسمه على الجانب الأيسر من الشاشة، كما هو موضح حول السهم 1.
لبدء تحرير ملف WSDL، انقر على الأسهم 2 إلى 4 بترتيب تصاعدي، وانت في الطريق الصحيح!
الخلاصة
مع ملفات WSDL المعتمدة على XML (لغة ترميز ممتدة)، يصبح من الأسهل قليلاً الفهم. قد تختلف ملفات WSDL في التعقيد اعتمادًا على مدى دقة أوصاف وظيفتها.



![[دليل] تحويل واجهات برمجة التطبيقات SOAP إلى واجهات برمجة التطبيقات REST](https://assets.apidog.com/blog/2024/02/convert-soap-to-rest-cover.png)