Tập tin WSDL là một tập tin định nghĩa các thông tin cần thiết để chúng ta có thể xây dựng một SOAP Web Service. Trong bài viết này, mình sẽ trình bày với các bạn chi tiết về nội dung của tập tin WSDL này các bạn nhé!
Đầu tiên, các bạn hãy xem một ví dụ về nội dung của tập tin WSDL như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://muleesbcxfsoapexpose.huongdanjava.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloWorldServiceService" targetNamespace="http://muleesbcxfsoapexpose.huongdanjava.com/"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="http://muleesbcxfsoapexpose.huongdanjava.com/" version="1.0"> <xs:element name="hello" type="tns:hello" /> <xs:element name="helloResponse" type="tns:helloResponse" /> <xs:complexType name="hello"> <xs:sequence> <xs:element minOccurs="0" name="arg0" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:complexType name="helloResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="helloResponse"> <wsdl:part element="tns:helloResponse" name="parameters" /> </wsdl:message> <wsdl:message name="hello"> <wsdl:part element="tns:hello" name="parameters" /> </wsdl:message> <wsdl:portType name="HelloWorldService"> <wsdl:operation name="hello"> <wsdl:input message="tns:hello" name="hello" /> <wsdl:output message="tns:helloResponse" name="helloResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloWorldServiceServiceSoapBinding" type="tns:HelloWorldService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="hello"> <soap:operation soapAction="" style="document" /> <wsdl:input name="hello"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="helloResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="HelloWorldServiceService"> <wsdl:port binding="tns:HelloWorldServiceServiceSoapBinding" name="HelloWorldServicePort"> <soap:address location="http://localhost:8081/hello" /> </wsdl:port> </wsdl:service> </wsdl:definitions> |
Như các bạn thấy, một tập tin WSDL sẽ được định nghĩa bắt đầu với tag root tên là <definitions> với khai báo nhiều namespace sẽ được sử dụng trong tập tin WSDL. Trong những namespace này thì các bạn hãy để ý namespace xmlns:soap=”http://schemas.xmlsoap.org/wsdl/soap/“, đây chính là namespace định nghĩa SOAP Web Service version đó các bạn.
Hiện tại SOAP Web Service có 2 phiên bản:
- Phiên bản SOAP 1.1 thì giá trị của namespace sẽ bắt đầu với “http://schemas.xmlsoap.org/soap/”
- Còn phiên bản SOAP 1.2 thì giá trị sẽ bắt đầu với “http://www.w3.org/2003/05/soap-envelope”.
Tất nhiên thì phiên bản 1.2 sẽ tốt hơn rồi phải không các bạn. 😀 Nhưng trong ví dụ mình đang sử dụng SOAP version 1.1.
Bên trong tag <definitions>, các bạn sẽ thấy tập tin WSDL định nghĩa thêm những tag con như sau:
Tag con đầu tiên tên là <types>, tag này sẽ chứa một định nghĩa XML Schema, định nghĩa các kiểu dữ liệu của SOAP message mà client gửi tới Web Service server. Nhờ đó mà Web Service của chúng ta có thể validate nội dung của SOAP message có tuân theo định nghĩa mà tập tin WSDL đã định nghĩa hay không.
Trong ví dụ trên, mình đã định nghĩa các kiểu dữ liệu cho tag <hello> và <helloResponse> trong SOAP message.
Tiếp theo các bạn sẽ thấy một hoặc nhiều tag con <message>, định nghĩa các SOAP messages mà SOAP Web Service của chúng ta sẽ process. Các bạn sẽ thấy mỗi SOAP message sẽ map với các kiểu dữ liệu mà chúng ta đã định nghĩa trong tag <types>.
Tiếp theo nữa các bạn sẽ thấy đó là tag con <portType>. Trong một tập tin WSDL thì chỉ có duy nhất một tag <portType>, bản chất là để định nghĩa các service interface của SOAP Web Service bao gồm các operation cùng với các mapping message. Một operation sẽ bao gồm message cho input (request message từ client) và message output (response message trả về cho client) và cả message nếu trong trường hợp có lỗi xảy ra. Các message này sẽ được định nghĩa trong tag <message> mà mình đã nói ở trên nha các bạn!
Trong ví dụ trên, mình đã định nghĩa một operation với input message là hello và output message là helloResponse đã được định nghĩa trong 2 tag <message> của tập tin WSDL.
Tag con gần cuối trong tag <definitions> là tag con <binding>. Tag này dùng để định nghĩa chi tiết implementation của SOAP Web Service của chúng ta, bao gồm transport protocol (HTTP), service style và SOAP version. Chúng ta có thể định nghĩa nhiều tag con <binding>, tuỳ theo số transport protocol mà chúng ta muốn SOAP Web Service hỗ trợ.
Tag con cuối mà các bạn có thể thấy đó là tag con <service>. Tag này sẽ đem tất cả các định nghĩa trong các tag ở trên để định nghĩa một service endpoint, nói nôm na thì nó định nghĩa URL để client có thể access được đấy các bạn.
Bên trong tag con <service> này, các bạn có thể thấy trong ví dụ ở trên, nó còn định nghĩa một hoặc nhiều tag con <port> nữa. Với:
1 |
<port> = <portType> + <binding> |
Chúng ta chỉ có duy nhất một tag con <portType> nên số lượng của tag <port> này phụ thuộc vào số lượng của tag <binding> mà chúng ta đã định nghĩa ở trên.