PDA

View Full Version : مقدمه ای بر WSDL



xamfia
شنبه 01 فروردین 1388, 14:35 عصر
در ادامه بحث مقدماتی که درباره سرویس های وب داشتم در این پست به سراغ WSDL می رویم .
یکی از سوالاتی که در پست قبلی مطرح کردم این بود که چگونه می توان برای استفاده از یک سرویس از چگونگی کنش و واکنش های آن آگاهی پیدا کرد؟؟
به عبارتی دیگر زمانی که شما می خواهید متد خاصی را فراخوانی کنید باید بدانید چه پارامترهایی از چه نوعی دریافت می کند و همچنین مقدار برگشتی اش چه می باشد؟ و یا شاید اصلا بخواهید توضیحاتی در مورد اینکه یک متد چکار خاصی را برای شما انجام میدهد را بدانید و ... راه چاره WSDL است.
WSDL(web service description language) همان طور که از نامش پیداست زبان و استانداردی برای تشریح یک سرویس است.
@ این زبان با فرمت XML است و برای تشریح یک وب سرویس که چگونه فراخوانی می شود و چه پارامترهایی می گیرد، استفاده می شود. WSDL از پنج قسمت به شرح زیر تشکیل شده است :
1) بخش <types> : در این بخش تمام گونه های داده ای که توسط سرویس مورد استفاده قرار می گیرد، تعریف می شود.
2) بخش <message>: پارامترهای ورودی و خروجی سرویس در این بخش تعریف می شوند.
3) بخش<portType>: روشهای دسترسی به پیغامهایی که در بخش پیش تعریف شده اند در این بخش قرار می گیرند. [این تگ از مهترین اجزا WSDL میباشد. در واقع این تگ نقش دروازه ورود به یک سرویس را بازی میکند.همان طور که شاید تا به حال حدس زده باشید در سرویس ها ما چیزی شبیه تابع Main در برنامه های قدیمی نداریم.در واقع این تگ برای ما تقریبا همان نقش را بازی میکند، یعنی به ما میگوید که از کجا شروع کنیم]
4) بخش<bindings>: پروتکلهایی که مورد استفاده قرار می گیرد (HTTP GET, HTTP POST, SOAP) در این بخش قرار می گیرد.
5) بخش<service> : تمام بخشهای ذکر شده تا اینجا، در این قسمت به هم متصل می شوند.
http://www.oracle.com/technology/sample_code/tutorials/fbs/images/wsdlstruct.jpg
( از@ تا اینجا از نوشته های مجید اطلس باف (http://radcom.ir/weblog/majid/) نیز بهره گرفته ام- قابل توجه کسانی که اخلاق علمی را رعایت نمی کنند!!)


ترجیح میدهم به جای تعاریف قلمبه سلمبه(!) که معمولا ما برنامه نویسان از آن متنفریم ، برویم به سراغ یک مثال سادهاز سایت آموزشی W3C در آدرس http://www.w3schools.com/webservices/tempconvert.asmx


در این مثال ما یک کلاس با کد زیر داریم :

<%@ WebService Language="VBScript" Class="TempConvert" %>
Imports System
Imports System.Web.Services
Public Class TempConvert :Inherits WebService
<WebMethod()> Public Function FahrenheitToCelsius
(ByVal Fahrenheit As String) As String
dim fahr
fahr=trim(replace(Fahrenheit,",","."))
if fahr="" or IsNumeric(fahr)=false then return "Error"
return ((((fahr) - 32) / 9) * 5)
end function
<WebMethod()> Public Function CelsiusToFahrenheit
(ByVal Celsius As String) As String
dim cel
cel=trim(replace(Celsius,",","."))
if cel="" or IsNumeric(cel)=false then return "Error"
return ((((cel) * 9) / 5) + 32)
end function
end class

فعلا نیازی به تفسیر کد بالا نیست پس خودتان را زیاد درگیر درک آن نکنید (در پست های آینده به تفسیر در مورد کد نویسی webservice بحث خواهم کرد) فقط در همین حد بدانید که این کلاس دو متد دارد برای تبدیل فارنهایت به سلسیوس و بلعکس.
در آدرس زیر می توانید این دو تابع را تست کنید و لذت ببرید!
http://www.w3schools.com/webservices/tempconvert.asmx (http://www.w3schools.com/webservices/tempconvert.asmx)
حال به سراغ بحث خودمان پیرامون WSDL برمیگردیم ، اگر شما سری به آدرس زیر بزنید میتوانید WSDL مربوط به کلاس بالا را مشاهده کنید:
http://www.w3schools.com/webservices/tempconvert.asmx?wsdl (http://www.w3schools.com/webservices/tempconvert.asmx?wsdl)
جالب بود نه؟!!

<s:element name="FahrenheitToCelsius">
<s:complexType>
<s:sequence>
@
<s:element minOccurs="0" maxOccurs="1" name="Fahrenheit" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
@@
<s:element name="FahrenheitToCelsiusResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="FahrenheitToCelsiusResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>


احتمالا در همین برخورد اول شما خودتان به رابطه های بسیاری برخوردید و شاید متوجه شده اید که WSDL چگونه می تواند با تگ های خود ویژگی های یک متد را ار قبیل تعداد و نوع پارامتر های ورودی ،نوع برگشتی تابع، توضیحات اضافی هر تابع و ... را شرح دهد.
در خط @ به بعد شما پارامتر ورودی تابع را ملاحظه میفرمائید که نامش Fahrenheitاست و نوع آن نیز String می باشد.
در خط @@ به بعد WSDL شرح مقدار برگشتی متد FahrenheitToCelsiusرا به ما می دهد که ناگفته پیداست که مقدار برگشتی متد(تابع) از نوع String می باشد.


http://www.wsper.org/wsdl20.png
در شکل بالا می توانید نمای کلی فرایند یک WSDL را ببینید و با چگونگی عملکرد کلی آشناتر شوید.
برای اطلاعات بیشتر میتوانید ار لینک زیر استفاده کنید


http://www.w3.org/TR/wsdl20 (http://www.w3.org/TR/wsdl20)



با تشکر


میثم نوایی



http://www.xamfia.com/about.aspx

amin_alexi
دوشنبه 03 فروردین 1388, 15:43 عصر
سلام
ممنون از توضیحاتی که در مورد این بحث دارید میدید (و ان شاء الله که ادامه دار باشه)
این پیشنهاد رو واسه منسجم کردن تاپیک میگم
اگه ممکنه تمام بحث رو در یک تاپیک به صورت ادامه دار دنبال کنید ... (مقدمه ای بر سرویس های وب (http://barnamenevis.org/forum/showthread.php?p=692502#post692502))
تا دوستان بتونند به راحتی تمام بحث رو دنبال کنند ...
در ضمن از تک Code برای نوشتن Code استفاده کنید (رو Icon ها علامت # رو کلیک کنید) تا خوانایی بالا بره ! :چشمک:
ممنون

milad_mhb
دوشنبه 17 فروردین 1388, 13:19 عصر
سلام ممنون از مقالتون.من يه منبع كامل و جامع مي خوام در مورد WSDL اگه لينك خوبي دارين ممنون ميشم بذارين اگه فارسي باشه بهتره .بازم ممنون

xamfia
شنبه 22 فروردین 1388, 10:32 صبح
قصد دارم در اولین فرصت که سرم خلوت شد یک مقاله جامع در مورد WSDL درج کنم اما فعلا می توانید از لینک های زیر کمک بگیرید.

http://www.w3schools.com/WSDL/default.asp
http://www.ibm.com/developerworks/library/ws-intwsdl/

xamfia
جمعه 16 مرداد 1388, 00:58 صبح
متاسفانه مدت زیادی وقت نکردم این پست را بروزرسانی کنم اما در این بخش قصد دارم در مورد برخی از تگ های مهم WSDL کمی توضیح دهم:

<?xml version="1.0" encoding="utf-8" ?>
این تگ همان معرفxml است که برای ایجاد هر سند xml لازم و ضروری است و شامل ورژن و انکودینگ xml میباشد


- (http://localhost/pws/pws-services/index.asmx?wsdl#) <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">



اولین تگ رسمی WSDL محسوب میشود و در واقع باقی تگ ها و بدنه WSDL در این تگ قرار میگیرد همچنین namespace ها نیز در این بخش معرفی میشوند.


- (http://localhost/pws/pws-services/index.asmx?wsdl#) <wsdl:types>
- (http://localhost/pws/pws-services/index.asmx?wsdl#) <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
- (http://localhost/pws/pws-services/index.asmx?wsdl#) <s:element name="HelloWorld">
<s:complexType />

</s:element>


- (http://localhost/pws/pws-services/index.asmx?wsdl#) <s:element name="HelloWorldResponse">
- (http://localhost/pws/pws-services/index.asmx?wsdl#) <s:complexType>
.
.
.




توصیف کننده شمای مورد استفاده در سرویس شما میباشد و در واقع در تگ بعدی <s:shema/> ما فرمت تمامی آیتم های به کار رفته شده در بدنه WSDL را شرح و بسط میدهیم.و اگر دقت کنید میتوانید متوجه شوید که تک تک عناصر شما در این بخش تعریف شما میشوند.(در این بخش دو فاکتور همیشه خودنمایی میکنند minoccurs و maxoccurs که بیان میکنند که عنصر مورد نظر تنها و تنها یکبار بار در سند ظاهر میشود و احتمالا فهمیده اید که تعاریف نوع دادهای چگونه در این بخش انجام میگیرد به طور مثال s:string و s:int و...)
با کمی دقت در این بخش به عنصری شبیه



<s:element name="HelloWorldResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>


نیز برخورد خواهید کرد که وضعیت نوع برگشتی را شرح میدهد و در واقع متوجه شدید که ما هم به توصیف درخواست Message ها می پردازیم و هم به توصیف پاسخ های آنان.
در روزهای آینده در مورد باقی تگ های WSDL از جمله


<wsdl:message...
<wsdl:portType…
<wsdl:binding…
<wsdl:service…

توضیحاتی خواهم داد.