شرح مختصر وب سرویس ها
خلاصه
این مقاله معرفی مقدماتی در مورد وب سرویس ها و عناصر مرتبط با آن یعنی 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 در زیر مشاهده می شود:
definition of types....
definition of message....
definition of portType....
definition of binding....
definition of service....
همانگونه که می بینید عناصر <types>,<message>,<portType> و <binding> همه فرزند عنصر ریشه definition هستند.
اجازه دهید با نگاه به سند HelloWorld.wsdl تلاش کنیم که معنی هرکدام از عناصر یاد شده را بفهمیم.(سند WSDL را به طور خودکار توسط Geronimo Eclipse Plugin (GEP) می توان ایجاد نمود)
<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>
وب سرویس تماما در رابطه با ارسال و دریافت پیام ها است.عنصر
این عنصر پیام های مختلفی را که توسط وب سرویس استفاده می شود تعریف می کند.در مثال ما, دو پیام به نام های " helloRequest " و " helloResponse " داریم که از نوع داده های " helloResponse" و "hello" که در عنصر
<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 وابسته است.
همچنین
ممکن است برای شما این سوال پیش بیاید که نقش 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"
<service>
عنصر service جایگاهی را که سرویس در آن قابل دستیابی است مشخص می کند.هر سرویس نام منحص ر به فردی دارد که همان مقدار ویژگی name در تگ ابتدای عنصر سرویس است.پس در مثال ما نام سرویسHelloWorldService است.عنصر بعدی یعنی
سرانجام عنصر