خلاصه

این مقاله معرفی مقدماتی در مورد وب سرویس ها و عناصر مرتبط با آن یعنی   SOAP, UDDI و WSDL می پردازد.

وب سرویس چیست؟

چرا وب سرویس؟

معماری وب سرویس

زبان توصیف کننده وب سرویس (WSDL)

 

وب سرویس چیست؟

وب سرویس ها سکوهایی هستند که ارتباط ضعیفی را بین برنامه های کاربردی ایجاد می کنند.

تکه کدی که از راه دور با HTTP فراخوانی می شود.یعنی یک درخواست مناسب HTTP برای فراخوانی وب  سرویس کافی است.

در گذشته سکوهای مخصوصی برای دستیابی به داده های باینری هم موجود بوده اند (مثلا RMI  یا IIOP) که دستیابی از راه دور را پیشنهاد می کنند.

وب سرویس ها سکوهایی هستند که برای معماری توزیع شده بکار می روند.در این روش تعدادی رایانه با استفاده از شبکه با هم ارتباط دارند و هریک ازبرنامه ها, ابزارها و تکنولوژی های مختلف که توسط شرکت  های مختلف تولید و عرضه شده اند استفاده می کنند.هرکدام از این برنامه های کاربردی می توانند با استفاده از SOAP,UDDI و WSDL در اختیار وب سرویس قرار گیرند.

چرا وب سرویس؟

برای استفاده از وب سرویس ها دلایلی وجود دارد که تعدادی از آنها بیان می شود:

1.      یکی از مهمترین دلیل ها این است که می توان یک همکاری بین محصولات شرکت های مختلف عرضه کننده برنامه های کامپیوتری ایجاد کرد.مثلا می توان با یک برنامه جاوا از یک برنامه دات نت استفاده کرد.

2.      با استفاده از وب سرویس برنامه قابلیت عمومی و همه جایی پیدا می کند.

3.      استفاده از پروتکل های استاندارد شده SOAP,UDDI,WSDL و HTTP برای پیاده سازی.

 

معماری وب سرویس

 

همانگونه که از شکل پیداست تهیه کننده وب سرویس آنرا در UDDI ثبت و WSDL را برای فراخوانی سرویس تهیه می کند.مشتری وب سرویس (که ممکن است یک برنامه client یا هر وب سرویس دیگری ممکن است باشد) درخواستی ارایه می دهد (به UDDI) و WSDL را پیدا می کند.سپس مشتری از WSDL برای گرفتن سرویس SOAP استفاده می کند.

زبان توصیف کننده وب سرویس (WSDL)

WSDL یک راه مبتنی بر XML برای توضیح وب سرویس است که مکان وب سرویس (آدرس URL) و متد های در دسترس آنرا مشخص می کند.

هر سند WSDL شامل عناصر فرزند <types>,<message>,<portType> و <binding> است.

گرامر نمونه ای از سند WSDL در زیر مشاهده می شود: 

<definitions>
<types>
definition of types....
types>
<message>
definition of message....
message>
<portType>
definition of portType....
portType>
<binding>
definition of binding....
binding>
<service>
definition of service....
service>
definitions>

همانگونه که می بینید عناصر  <types>,<message>,<portType> و <binding> همه فرزند عنصر ریشه definition هستند.

 

اجازه دهید با نگاه به سند HelloWorld.wsdl  تلاش کنیم که معنی هرکدام از عناصر یاد شده را بفهمیم.(سند   WSDL را به طور خودکار توسط Geronimo Eclipse Plugin (GEP) می توان ایجاد نمود)

 



<wsdl:definitions>
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="http://webservices" xmlns="http://www.w3.org/2001/XMLSchema">
   <element name="hello">
    <complexType/>
   element>
   <element name="helloResponse">
    <complexType/>
   element>
  schema>
 wsdl:types>

 

  <wsdl:part element="intf:hello" name="parameters"/>

  <wsdl:part element="intf:helloResponse" name="parameters"/>

  <wsdl:operation name="hello">

     <wsdl:input message="intf:helloRequest" name="helloRequest"/>

     <wsdl:output message="intf:helloResponse" name="helloResponse"/>

  </wsdl:operation>

  <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

  <wsdl:operation name="hello">

     <wsdlsoap:operation soapAction=""/>

     <wsdl:input name="helloRequest">

        <wsdlsoap:body use="literal"/>

     </wsdl:input>

     <wsdl:output name="helloResponse">

        <wsdlsoap:body use="literal"/>

     </wsdl:output>

  </wsdl:operation>

  <wsdl:port binding="intf:HelloWorldSoapBinding" name="HelloWorld">

     <wsdlsoap:address location="http://localhost:8080/SimpleWeb/services/HelloWorld"/>

  </wsdl:port>

 

 

وب سرویس تماما در رابطه با ارسال و دریافت پیام ها است.عنصر  تمام پیام های مختلفی را که توسط سرویس استفاده می شود را شرح می دهد.اساسا این قسمت انواع داده ها را تعریف می کند.همانطور که دیده می شود سرویس HelloWorld از داده هایی با ساختار hello و helloResponse به  عنوان پیام استفاده می کند.


این عنصر پیام های مختلفی را که توسط وب سرویس استفاده می شود تعریف می کند.در مثال ما, دو پیام به نام های             " helloRequest " و " helloResponse " داریم که از نوع داده های " helloResponse" و "hello" که در عنصر  معرفی شدند می باشند.باید دقت کنید که هر نوع پیام دارای نام منحصر به فردی است که همان مقدار خصوصیت name در تگ ابتدایی پیام است; مقدار خصوصیت element در تگwsdl:part به نوع داده ای که این پیام مرتبط با آن است راهنمایی می کند.. element can be considered as a parameter to a function call.

<portType>

هر portType شامل یک عنصر  operation متعلق به خود است که هر کدام از آنها هم شامل  "input message"          و "output message" می باشند.البته هیچ الزامی به وجود هردو زیر عنصر یا حتی یکی از  آنها نیست و هرکدام ساختار پیام ورودی و خروجی به متد را مشخص می کنند.در مثال ما عملگر به نامhello پیامی را به نام helloRequest که از نوع پیامی به نام helloRequest است (و در message ها معرفی شده است) به عنوان پیام خروجی می فرستد.در پاسخ هم باید پیامی به نام helloResponse که از نوع پیام های به نام helloResponse است را دریافت کند.

<bindings>

در این بخش قالب پیام ها و جزییات پروتکل مربوط به operation و پیام ها که در portType معرفی شده اند تعریف می شود.هر عنصر binding به وسیله نام منحصر به فردش شناخته می شود.مقدار ویژگی typeمربوط به هر عنصر binding نام portType را که این binding به آن ارجاع دارد مشخص می کند.بنابراین در مثال ما نام binding برابر "HelloWorldSoap Binding" و portType مرتبط با آن دارای نام " HelloWorld " در فضای نام intf است.

ویژگی style این عنصر می تواند هم RPC-oriented و هم  document-oriented مقدار گیرد.ویژگی دیگرtransport است که پروتکل استفاده شده برای انتقال را مشخص می کند.در این مثال style از نوعdocument و پروتکل جابجایی http است.

هر عنصر binding دارای عنصری به نام operation  است که نام آن با نام operation مرتبط با آن که درportType معرفی شده است یکی می باشد.هر عنصر operation دارای یک soapAction وابسته است.

 نشان می دهد ورودی این operation دارای نام helloRequest است که اگر دقت کنید در قسمت portType و در عنصر operation آن که هم نام با همین operation در بخشbinding است پیامی را باهمین نام دیدیم و نوع ورودی operation معرفی شده در binding را مشخص می  کند.

همچنین  استاندارد رمزنگاری به کار رفته را نشان می دهد که در مثال ما از استاندارد literal برای رمزنگاری استفاده شده است. 

ممکن است برای شما این سوال پیش بیاید که نقش soapAction در سند WSDL چیست؟در واقع بر خلاف سایر قسمت های موجود در سند WSDL که هرکدام به توضیح یا تعریف پیام(message) یا ساختار آن می پردازند و می توانند به فهم ما در رابطه با چگونگی شکل دادن به درخواست ها یا روش تفسیر پاسخ دریافتی کمک کنند،soapAction به طور مستقیم در تفسیر سند WSDL و فهم آن توسط ما نقشی ندارد!نقش این قسمت در راهنمایی درخواست های رسیده به سمت عملگر(operation) درست است
البته لزومی در وجود این قسمت در هر عنصر operation در binding نیست و یا می توان آنرا تهی رها کرد.soapAction در HTTP header درخواست ظاهر می شود و درخواست را به سمت عملگر درست راهنمایی می کند.در اینجا می توانید نمونه ای از یک درخواست HTTP فرضی را مشاهده کنید:

 

POST /InStock HTTP/1.1

 

Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: 299 SOAPAction: "http://www.w3.org/2003/05/soap-envelope"

IBM

 

 

<service>

عنصر service جایگاهی را که سرویس در آن قابل دستیابی است مشخص می کند.هر سرویس نام منحص ر به فردی دارد که همان مقدار ویژگی name در تگ ابتدای عنصر سرویس است.پس در مثال ما نام سرویسHelloWorldService است.عنصر بعدی یعنی   عنصر binding که توسط سرویس استفاده می شود را مشخص می کند.

سرانجام عنصر   آدرس فیزیکی(URL) را برای دستیابی به سرویس مشخص می کند.