
Java Mobile
name="number" type="s:string" />
<s:element minOccurs="1" maxOccurs="1"
name="type" type="s:string" />
<s:element minOccurs="1" maxOccurs="1"
name="balance" type="s:decimal" />
</s:sequence>
<s:attribute name="status" type="s:string" />
</s:complexType>
Dựa vào định nghĩa trên, một đối tượng thuộc lớp Acct có thể được thể hiện như
sau:
<?xml version="1.0" encoding="utf-8"?>
<account status="active">
<description>Adam's savings acct</description>
<number>1234-XX</number>
<type>SV</type>
<balance>10000</balance>
</account>
Sau đó chúng ta phải định nghĩa cấu trúc các thông điệp được trao đổi trong
quá trình gọi hàm và nhận kết quả. Ta tuân theo một quy tắc: cấu trúc gói tin request
(lời gọi hàm) sẽ có tên trùng với tên hàm, cấu trúc gói tin response sẽ có tên là tên
hàm cộng với Response ở cuối.
<s:element name="GetAccount">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="acctNumber" nillable="true"
166

Java Mobile
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetAccountResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="account" type="s0:Acct" />
</s:sequence>
</s:complexType>
</s:element>
Trên đây là toàn bộ nội dung phần types.
8.3.2.2. Phần tử message:
Bên cạnh việc định nghĩa các kiểu dữ liệu được truyền giữa client và server
ta cần phải định nghĩa các thông điệp được truyền đi và hồi đáp. Bởi và các thông
điệp không phụ thuộc vào các giao thức tầng dưới nên các thông điệp có thể được
định nghĩa dưới dạng HTTP-GET/POST, SOAP hay bất kỳ một protocol nào hỗ trợ
Web Service.
Chúng ta có thể đặt tên bất kỳ cho thông điệp vì web service không đưa ra
một ràng buộc cũng như quy tắc đặt tên nào cả. Các phần tử message có thể chứa
nhiều phần tử con "part" (cũng có khi không chứa phần tử con nào). Một phần tử
"part" tượng trưng cho một tham số được truyền trong hàm. Một phần tử part phải
có một tên và kiểu dữ liệu tương ứng đã được định nghĩa.
Đối với ví dụ trên thì phần tử message có dạng như sau:
<message name="GetAccountIn">
<part name="parameters" element="s0:GetAccount" />
</message>
167

Java Mobile
<message name="GetAccountOut">
<part name="parameters" element="s0:GetAccountResponse" />
</message>
Ở đây ta gập lại cấu trúc GetAccout và GetAccountResponse đã định nghĩa ở
phần types. Theo như định nghĩa trên, thông điệp đầu vào GetAccountIn nhận một
tham số có kiểu GetAccount và thông điệp đầu ra GetAccountOut trả về một kết
quả có kiểu GetAccountResponse; cả hai kiểu này đã được định nghĩa ở phần tử
types trước đó. Các message được định nghĩa này sẽ được dùng ở phần sau.
8.3.2.3. Phần tử portType:
Ta có thể nói một cách đơn giản như sau: phần tử “types” định nghĩa các
kiểu dữ liệu, phần tử “message” định nghĩa tất cả các thông điệp (hay cũng có thể
gọi là gói tin) vào/ra nhưng lại chưa thể hiện được “thông điệp nào là của phương
thức nào”, vai trò này do portType đảm nhận.
<portType name="BankService">
<operation name="GetAccount">
<input message="s0:GetAccountIn" />
<output message="s0:GetAccountOut" />
</operation>
</portType>
Chúng ta có thể nhận thấy, các từ khóa input và output được dùng để chỉ rõ gói
tin request và gói tin response.
Phần định nghĩa portType trên cũng khá đơn giản, đối với hàm GetAccount ( ) sẽ có
hai thông điệp:
• Thông điệp input: Lời gọi hàm từ client gửi lên server, có tên
GetAccountIn. Nếu đọc ngược lên phần tử message, ta sẽ thấy thông điệp
168

Java Mobile
GetAccountIn sẽ có kiểu GetAccount, và kiểu dữ liệu GetAccount được định
nghĩa trong phần tử types.
• Thông điệp output: Kết quả trả về được gửi từ server đến client, có tên
GetAccountOut. Tương tự, phần tử message đã cho chúng ta biết thông điệp
GetAccountOut sẽ có kiểu GetAccountResponse và kiểu này đã được định
nghĩa trong phần types.
8.3.2.4. Phần tử binding
Các phần tử chúng ta đã xem xét qua có trách nhiệm định nghĩa web service
một cách trừu tượng: chúng cho biết các phương thức được web service hỗ trợ, các
thông tin kèm theo như tham số truyền vào, kết quả trả về của mỗi phương thức.
Tuy nhiên, với những thông tin trên chúng ta chưa xác định được sẽ phải dùng công
cụ nào để truy xuất đến web service này: ta sẽ dùng SOAP kết hợp với HTTP hay
SOAP/HTTPS hay công cụ nào khác? Phần tử binding sẽ định nghĩa cách thức truy
cập web service thông qua các protocols bên dưới.
Mỗi phần tử binding sẽ mô tả cách thức liên kết một portType vào một
protocol nhất định. Nếu web service của chúng ta hỗ trợ nhiêu protocol thì phải tạo
cho mỗi protocol một phần tử binding.
<binding name="BankService" type="s0:BankService">
<soap:binding transport = "http://schemas.xmlsoap.org/soap/http"
style="document" />
<operation name="GetAccount">
<soap:operation soapAction =
“http://woodgrovebank.com/GetAccount” style="document" />
<input>
<soap:body use="literal" />
</input>
169

Java Mobile
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
Đoạn ví dụ trên cho biết web service sử dụng SOAP là protocol trao đổi
thông tin và gói tin soap sẽ được vận chuyển bằng HTTP, chúng ta có thể sử dụng
nhiều công cụ khác để truy xuất đến các hàm của web service nhưng SOAP hiện
nay là thông dụng nhất. Đoạn định nghĩa trên còn chỉ rõ “document/encoding style”
được sử dụng là dạng document/literal (còn có một dạng khác khá phổ biến là
rpc/encoded; hiện tại j2me chỉ hỗ trợ web service dạng document/literal).
8.3.2.5. Phần tử service:
Phần cuối cùng của file WSDL chứa định nghĩa các thông số vật lý cụ thể
dùng để truy xuất đến web service.
<service name="BankService">
<port name="BankService" binding="s0:BankService">
<soap:address location =
"http://www.woodgrovebank.com/Bank/BankService.asmx"/>
</port>
</service>
Giá trị location trong phần tử port chỉ rõ vị trí đặt web service. Phần tử
“binding” cho biết cách thức ánh xạ các phương thức trong phần tử “portType”
thành các gói tin SOAP (hoặc gói tin của các protocols khác) nhưng không cho biết
làm thế nào để tạo được một đối tượng portType. Đấy là nhiệm vụ của phần tử port,
phần tử port sẽ ánh xạ một phần tử portType sang một địa chỉ URI cụ thể. Node
170

