Như trong Ví dụ 2.2.1.2 trên ta thấy thuộc tính xsi:type thiết lập là xsd:int, xác ñịnh giá trị trả về là giá trị kiểu int. ðặc tả SOAP cung cấp vài tùy chọn ñể chỉ ñịnh kiểu dữ liệu cho phần tử XML cụ thể. Tùy chọn thứ nhất để xác định một thuộc tính xsi:type cho mỗi phần tử. Thứ hai để lưu trữ thơng tin kiểu dữ liệu trong một XML Schema bên ngoài hoặc thậm trí là tài liệu con người có thể hiểu được. Các cơng cụ SOAP có thể tự động thêm hoặc bỏ qua thuộc tính xsi:type trong khi khai báo phần tử[8].
58
2.3.5.2 Kiểu phức hợp
Các mảng SOAP có một tập hợp các quy tắc rất rõ ràng, nó yêu cầu phải chỉ rõ cả kiểu phần tử và kích cỡ mảng. SOAP cũng hỗ trợ mảng nhiều chiều, nhưng không phải tất cả các triển khai SOAP hỗ trợ chức năng nhiều chiều(tùy thuộc vào công cụ triển khai SOAP ).
ðể tạo một mảng ta phải chỉ rõ thuộc tính xsi:type của mảng. Mảng cũng bao gồm thuộc tính arrayType. Thuộc tính được u cầu ñể xác ñịnh khiểu dữ liệu cho các phần tử của mảng và số chiều của mảng. ví dụ: khai báo mảng 1 chiều với kích cỡ 10, kiểu dữ liệu là double arrayType="xsd:double[10]". Hoặc khai bảo mảng hai chiều kiểu dữ liệu string và kích cỡ mỗi chiều đều là 5 phần tử arrayType="xsd:string[5,5]" [8].
Dưới đây là ví dụ một phản hồi SOAP với một mảng với các giá trị kiểu double <SOAP-ENV:Body> <ns1:getPriceListResponse xmlns:ns1="urn:examples:pricelistservice" SOAP-ENV:encodingStyle="http://www.w3.org/2001/09/soap-encoding"> <return xmlns:ns2="http://www.w3.org/2001/09/soap-encoding" xsi:type="ns2:Array" ns2:arrayType="xsd:double[2]"> <item xsi:type="xsd:double">54.99</item> <item xsi:type="xsd:double">19.99</item> </return> </ns1:getPriceListResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Chú ý: khi arrayType ñặt là xsd:double[2] thì mỗi phần tử trong mảng phải được chỉ rõ trong phần tử item như trên. Ngược lại với mảng, cấu trúc chứa nhiều giá trị, nhưng mỗi phần tử ñược xác ñịnh với duy nhất một phần tử truy nhập. Ví dụ, xét một mục trong bảng các sản phẩm thì cấu trúc mô tả mục đó có thể chứa
productSKU, productName, mơ tả và giá. Dưới đây là cấu trúc biểu diễn thơng điệp SOAP[8]. <SOAP-ENV:Body> <ns1:getProductResponse xmlns:ns1="urn:examples:productservice" SOAP-ENV:encodingStyle="http://www.w3.org/2001/09/soap-encoding"> <return xmlns:ns2="urn:examples" xsi:type="ns2:product">
<name xsi:type="xsd:string">Red Hat Linux</name> <price xsi:type="xsd:double">54.99</price>
<description xsi:type="xsd:string">Red Hat Linux Operating System </description>
<SKU xsi:type="xsd:string">A358185</SKU> </return>
</ns1:getProductResponse> </SOAP-ENV:Body>
Mỗi phần tử trong cấu trúc ñược xác ñịnh với một tên truy nhập duy nhất. Ví dụ, thơng điệp trên bao gồm 4 phần tử truy nhập, name, price, description, và SKU. Mỗi phần tử có thể có một kiểu dữ liệu riêng; như name có kiểu là string, price là có kiểu là double.
2.3.6 Literal Encoding
Không cần thiết phải sử dụng mã hóa kiểu mẫu SOAP. Thực tế, thỉnh thoảng ta muốn bỏ qua các quy tắc mã hóa SOAP và nhúng một tài liệu XML trực tiếp vào thơng điệp SOAP. ðể làm như vậy ta phải tham chiếu tới một kiểu mã hóa Literal XML, và phải chỉ rõ mã hóa kiểu mẫu Literal XML. Trong Apache SOAP, mã hóa kiểu mẫu Literal XML ñược chỉ rõ với namespace http://xml.apache.org/xml- soap/literalxml. Ví dụ, dưới đây là tùy chọn thứ hai về mã hóa thơng tin sản phẩm trong mục 2.3.5.2. Sẽ ñơn giản hơn nếu thay vì mã hóa sản phẩm thành cấu trúc SOAP, dữ liệu được mã hóa như một tài liệu XML mã hóa kiểu mẫu Literal[8].
60 <SOAP-ENV:Body> <ns1:getProductResponse xmlns:ns1="urn:examples:XMLproductservice" SOAP-ENV:encodingStyle= "http://xml.apache.org/xml-soap/literalxml"> <return> <product sku="A358185"> <name>Red Hat Linux</name>
<description>Red Hat Linux Operating System</description> <price>54.99</price></product>
</return>
</ns1:getProductResponse> </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
2.3.7 Truyền tải SOAP qua HTTP
SOAP không phân biệt bất kỳ giao thức truyền tải nào. Trên thực tế, SOAP có thể ñược truyền tải qua SMTP, FTP, MQSeries của IBM, Microsoft Message Queue(MMQ). Tuy nhiên, đặc tả SOAP chỉ mơ tả chi tiết về HTTP và nó là giao thức truyền tài SOAP phổ biến. Các yêu cầu SOAP ñược gửi qua yêu cầu HTTP và các phản hồi SOAP ñược trả về trong nội dung của phản hồi HTTP. Mặc dù các u cầu SOAP có thể được gửi qua HTTP GET, nhưng đặc tả SOAP chỉ mơ tả chi tiết HTTP POST(HTTP POST được ưu tiên hơn bởi vì hầu hết các máy chủ ñặt yêu cầu hạn chế ký tự trên các yêu cầu GET). Thêm nữa, cả hai yêu cầu và phản hồi HTTP phải ñược thiết lập kiểu nội dung là text/xml. Như một yêu cầu bổ sung, các máy trạm phải chỉ rõ một SOAP Action header. SOAP Action header là một URI ñược sử dụng để chỉ ra mục đích của u cầu. ðiều này làm nó có xác định nhanh bản chất của một yêu cầu SOAP, không cần phải kiểm tra nội dung thơng điệp SOAP[8].
ðặc tả SOAP yêu cầu máy trạm phải cung cấp một SOAP Action header, nhưng giá trị thực của nó bị phụ thuộc triển khải trên máy chủ SOAP. ví dụ, để truy
nhập dịch vụ AltaVista BabelFish Translation ñược cài ñặt bằng Xmethods, bạn phải chỉ rõ urn:xmethodsBabelFish#BabelFish như một SOAP Action header. Thậm trí nếu máy chủ khơng u cầu một SOAP Action header đầy đủ, máy trạm phải chỉ rõ một chuỗi trống hoặc ñặt giá trị rỗng. Ví dụ:
SOAPAction: "" SOAPAction:
Ví dụ ñơn giản về yêu cầu ñược gửi qua HTTP tới dịch vụ XMethods Babelfish Translation[8].
POST /perl/soaplite.cgi HTTP/1.0 Host: services.xmethods.com
Content-Type: text/xml; charset=utf-8 Content-Length: 538 SOAPAction: "urn:xmethodsBabelFish#BabelFish" <?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:BabelFish xmlns:ns1="urn:xmethodsBabelFish" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <translationmode xsi:type="xsd:string">en_fr</translationmode>
<sourcedata xsi:type="xsd:string">Hello, world!</sourcedata> </ns1:BabelFish>
</SOAP-ENV:Body> </SOAP-ENV:Envelope>
Chú ý: Content-Type, SOAPAction, và phương thức BabeFish yêu cầu hai tham số kiểu chuỗi. Chế độ thơng dịch en_fr sẽ thông dịch từ tiếng Anh sang tiếng Pháp. ðây là phản hồi từ Xmethods:
62 HTTP/1.1 200 OK
Date: Sat, 09 Jun 2001 15:01:55 GMT
Server: Apache/1.3.14 (Unix) tomcat/1.0 PHP/4.0.1pl2 SOAPServer: SOAP::Lite/Perl/0.50
Cache-Control: s-maxage=60, proxy-revalidate Content-Length: 539 Content-Type: text/xml <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope …> <SOAP-ENV:Body>
<namesp1:BabelFishResponse xmlns:namesp1="urn:xmethodsBabelFish"> <return xsi:type="xsd:string">Bonjour, monde!</return>
</namesp1:BabelFishResponse>
</SOAP-ENV:Body> </SOAP-ENV:Envelope>
Các SOAP response ñược phân phối qua HTTP bắt buộc phải theo các mã trạng thái giống HTTP, ví dụ trạng thái 200 OK xác định là thành cơng, 500 là trạng thái lỗi trong máy chủ và phản hồi SOAP gồm có phần tử Fault.
2.4 Service Description: WSDL
WSDL là một đặc tả định nghĩa phương pháp mơ tả dịch vụ Web trong một ngữ pháp XML chung, nó thường được lưu dưới dạng file *.wsdl, ñược máy trạm sử dụng mỗi khi kết nối với dịch vụ Web. WSDL mô tả 4 thông tin quan trọng của dịch vụ Web[8]:
Thông tin mô tả tất cả các Hàm ñược công bố.
Thông tin kiểu dữ liệu cho tất cả các thơng điệp yêu cầu và phản hồi. Thông tin về giao thức truyền tải ñược sử dụng.
Thơng tin địa chỉ xác ñịnh dịch vụ cụ thể.
WSDL không nhất thiết phải gắn liền với một hệ thống thơng điệp XML cụ thể, nhưng nó bao gồm phần mở rộng dựng sẵn cho mô tả các dịch vụ SOAP.
Ví dụ 2.4 cung cấp một file WSDL đơn giản. File này mô tả các giao diện công bố dịch vụ thơng tin thời tiết ở trên. Có hai ñiểm chính cần quan tâm.
ðầu tiên, Các phần tử <message> xác ñịnh các thơng điệp XML riêng biệt được chuyển giao giữa các máy tính. Trong trường hợp này, chúng ta có một getWeatherRequest và getWeatherResponse.
Thứ hai, các phần tử <service> xác ñịnh rằng dịch vụ sẵn sàng dưới dạng SOAP tại http://localhost:8080/soap/servlet/rpcrouter[8].
<?xml version="1.0" encoding="UTF-8"?> <definitions name="WeatherService" targetNamespace="http://www.ecerami.com/wsdl/WeatherService.wsdl" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.ecerami.com/wsdl/WeatherService.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <message name="getWeatherRequest"> <part name="zipcode" type="xsd:string"/> </message>
<message name="getWeatherResponse"> <part name="temperature" type="xsd:int"/> </message> <portType name="Weather_PortType"> <operation name="getWeather"> <input message="tns:getWeatherRequest"/> <output message="tns:getWeatherResponse"/> </operation> </portType>
<binding name="Weather_Binding" type="tns:Weather_PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getWeather"> <soap:operation soapAction=""/>
<input>
64 namespace="urn:examples:weatherservice" use="encoded"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:weatherservice" use="encoded"/>
</output> </operation> </binding> <service name="Weather_Service">
<documentation>WSDL File for Weather Service</documentation> <port binding="tns:Weather_Binding" name="Weather_Port">
<soap:address location="http://localhost:8080/soap/servlet/rpcrouter"/> </port> </service> </definitions>
Ví dụ 2.4 : Mơ tả một file *.WSDL 2.4.1 Các thành phần trong file WSDL
ðặc tả WSDL chia làm 6 phàn tử chính[8]:
definitions: Phần tử <definition> phải là phần tử gốc của tài liệu WSDL. Nó
định nghĩa tên của dịch vụ Web, khai báo nhiều namespace ñược sử dụng
trong suốt phần còn lại của tài liệu, và chứa tất cả các phần tử dịch vụ ñược mô tả ở ñây.
Types: Phần tử <types> mô tả tất cả các kiểu dữ liệu ñược sử dụng giữa máy trạm và máy chủ. WSDL không bị ràng buộc vào một hệ thống duy nhất, nhưng nó mặc định sử dụng đặc tả W3C XML Schema. Nếu dịch vụ chỉ sử dụng các kiểu dựng sẵn, đơn giản của XML Schame, như string, integer, thì phần tử types khơng cần thiết phải có.
Message: Phần tử <message> mô tả một thơng điệp một chiều, nó là một thơng điệp u cầu hoặc phản hồi. Nó định nghĩa tên của thơng điệp và bao gồm khơng hoặc có thêm phần tử <part> có thể tham chiếu tới các tham số hoặc giá trị mà thơng điệp trả về.
portType: Phần tử <portType> bao gồm nhiều phần tử <message> dưới hình thức hồn toàn một chiều hoặc thao tác di chuyển vòng trịn. Ví du, một
portType có thể kết hợp một thơng điệp u cầu và một thơng điệp phản hồi trong một thao tác Request/Response ñơn lẻ, đây là cách thơng thường nhất ñược sử dụng trong các dịch vụ SOAP. Chú ý rằng một port Type có thể (và thường xun) định nghĩa nhiều thao tác.
Binding: Phần tử <binding> mô tả các chi tiết cụ thể một dịch vụ sẽ được thực thi trên mơi trường mạng. WSDL gồm có các định nghĩa mở rộng dựng sẵn về các dịch vụ SOAP, và thông tin cụ thể của SOAP tại ñây.
Service: Phần tử <service> ñịnh nghĩa ñịa chỉ thực hiện một dịch vụ cụ thể. Thơng thường nhất là một URL để thực hiện dịch vụ SOAP.
Hình 2.4.1 - ðặc tả WSDL
Ngồi 6 phần tử chính, đặc tả WSDL cũng định nghĩa các phần tử phụ trợ: documentation: Phần tử <documentation> ñược sử dụng ñể cung cấp tài liệu mà con người có thể hiểu và có thể được đưa vào trong bất kỳ một phần tử WSDL khác.
Import:Phần tử <import> ñược sử dụng ñể nhập khẩu các tài liệu WSDL khác hoặc các XML Schema. ðiều này cho phép các tài liệu WSDL mơ-dun hóa hơn. Ví dụ, hai tài liệu WSDL có thể cùng nhập khẩu các phần tử cơ bản và chưa bao gồm các phần tử dịch vụ của nó để tạo ra cùng một dịch vụ trên hai ñịa chỉ vật lý.
2.4.2 Kiểu dữ liệu XML Schema.
ðể một máy trạm SOAP giao tiếp hiệu quả với một máy chủ SOAP, máy trạm và máy chủ phải thống nhất một hệ thống kiểu dữ liệu. Mặc ñịnh, XML 1.0 không cung cấp một hệ thống kiểu dữ liệu. Ngược lại, mọi ngơn ngữa lập trình cung
66
cấp một vài cơ sở ñể khai báo các kiểu dữ liệu, như integer, float, double và string. Một trong những thách thức lớn nhất trong việc xây dựng dịch vụ Web là tạo một hệ thống kiểu dữ liệu chung có thể được sử dụng bởi tập hợp đa dạng các ngơn ngữ lập trình chạy trên tập hợp ña dạng các hệ ñiều hành[8].
WSDL khơng có mục ñích tạo ra kiểu dữ liệu chuẩn cho XML. Trong thực tế, WSDL ñược ñặc tả một cách mềm dẻo nhất và nó khơng bị ràng buộc với bất kỳ một hệ thống kiểu dữ liệu nào. Tuy nhiên, WSDL các kiểu ñược ñặc tả mặc ñịnh bởi W3C XML Schema. ðặc tả XML Schema hiện nay cũng ñược sử dụng rộng rãi nhất ñể ñặc tả kiểu dữ liệu[8].