SNMP4J API là một thư viện lập trình ứng dụng mã nguồn mở được xây dựng trên nền ngơn ngữ Java. Tất cả các mã nguồn ñược triển khai bằng ngơn ngữ lập trình java vì vậy các tệp ñược lưu dưới dạng *.java, nội dung mã nguồn tham khảo trong [6].
48
CHƯƠNG 2
CÔNG NGHỆ DỊCH VỤ WEB 2.1 Khái niệm và kiến trúc dịch vụ Web
2.1.1 Khái niệm.
Theo ñịnh nghĩa của W3C, dịch vụ Web là một hệ thống phần mềm ñược thiết kế ñể hỗ trợ khả năng tương tác giữa các ứng dụng trên các máy tính khác nhau thơng qua mạng Internet, giao diện chung và sự gắn kết của nó được mơ tả bằng XML. dịch vụ Web là tài nguyên phần mềm có thể xác định bằng ñịa chỉ URL, thực hiện các chức năng và đưa ra các thơng tin người dùng yêu cầu. Một dịch vụ Web ñược tạo nên bằng cách lấy các chức năng và đóng gói chúng sao cho các ứng dụng khác dễ dàng nhìn thấy và có thể truy cập ñến những dịch vụ mà nó thực hiện, ñồng thời có thể u cầu thơng tin từ dịch vụ Web khác. Nó bao gồm các
mơ đun độc lập cho hoạt ñộng của khách hàng và doanh nghiệp và bản thân nó
được thực thi trên server[3].
Một dịch vụ Web như bất kỳ dịch vụ nào sẵn có trên internet, sử dụng hệ thống thơng điệp chuẩn hóa XML, và không phụ thuộc bất kỳ một hệ ñiều hành hoặc ngơn ngữ lập trình. Có một vài lựa chọn ñịnh dạng thơng điệp XML, như XML-RPC hoặc SOAP. Ngoài ra chúng ta có thể sử dụng HTTP GET/POST để chuyển các tài liệu XML qua mơi trường mạng[8].
2.1.2 Kiến trúc
Có hai cách để xem xét kiến trức dịch vụ Web
2.1.2.1 Roles
Có 3 Role chính trong kiến trúc dịch vụ Web [8]:
Service provider: ðây là thành phần cung cấp dịch vụ Web, nó triển khai dịch vụ và làm cho nó sẵn sàng trên internet.
Service requestor: ðây là thành phần thực hiện công việc khai thác dịch vụ Web. Người dùng sử dụng một dịch vụ Web bằng cách mở một kết nối mạng và gửi một yêu cầu XML.
Service registry: ðây là thư mục trung tâm hóa dạng logic của dịch vụ. Nó cung cấp một ñịa chỉ trung tâm ñể người phát triển có thể cơng bố một dịch vụ mới hoặc tìm kiếm một dịch vụ có sẵn. Nó đóng vai trị như một trung tâm tập trung các công ty và các dịch vụ của họ.
Hình 2.1.2.1 - Mô tả các Role trong kiến trúc một Dịch vụ Web
2.1.2.2 Chồng giao thức
Service transport: Tầng này chịu trách nhiệm truyền tải các thơng điệp giữa
các ứng dụng. Hiện tại tầng này bao gồm bao gồm các giao thức HTTP,
SMTP, FTP, BEEP.
XML messaging: Tầng này chịu trách nhiệm mã hòa các thơng điệp theo một dạng XML thơng thường mà phía máy khai thác ñầu cuối có thể hiểu ñược. Hiện tại tầng này bao gồm XML-RPC và SOAP.
Service description: Tầng này chịu trách nhiệm mô tả các giao diện công cộng của một dịch vụ Web cụ thể. Hiện tại, mơ tả dịch vụ được xử lý qua WSDL.
Service discovery: Tầng này chịu trách nhiệm trung tâm hóa các dịch vụ vào trong một đăng ký chung, và cung cấp các chức năng dễ dàng cơng bố hoặc tìm kiếm. Hiện tại, tầng này ñược xử lý qua UDDI.[8]
50
2.2 Các dạng thông ñiệp XML
Như đã nói ở trên có hai dạng thơng điệp XML ñược sử dụng trong dịch vụ Web, trong đó XML-RPC là cách dễ nhất để bắt đầu với dịch vụ Web. Nó đơn giản hơn và dễ hiểu hơn SOAP. Tuy nhiên, không giống như SOAP, XML-RPC khơng có ngữ pháp mơ tả dịch vụ tương ứng. ðiều này hạn chế việc gọi tự ñộng một loạt các dịch vụ XML-RPC một yếu tố quan trọng ñể cho phép xây dựng các ứng dụng tích hợp tức thời. Trong phạm vi tài liệu chúng tơi xin trình bày chi tiết về ñịnh dạng thơng điệp SOAP. Nội dung của các thơng điệp được hệ thống tự sinh mã XML trong quá trình duyệt và hiển thị.
2.2.1 SOAP
SOAP là một giao thức dựa trên XML, ñược sử dụng ñể trao đổi thơng tin giữa các máy tính. Mặc dù SOAP có thể được sử dụng trong một loạt các hệ thống thơng điệp và có thể được phân phối qua nhiều giao thức truyền tải, điểm chính của SOAP là truyển tải các RPC qua HTTP. Giống như XML-RPC, SOAP là nền tảng độc lập và do đó cho phép các ứng dụng đa dạng có thể giao tiếp với nhau. ðể hiểu hơn về SOAP, chúng ta hãy xem xét lại dịch vụ Web cho phép truy vấn thông tin thời tiết. Dưới đây là một ví dụ về SOAP Request (HTTP header ñã ñược bỏ qua) [8]: <?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/09/soap-envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:getWeather xmlns:ns1="urn:examples:weatherservice" SOAP-ENV:encodingStyle="http://www.w3.org/2001/09/soap- encoding/"> <zipcode xsi:type="xsd:string">10016</zipcode> </ns1:getWeather> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Nội dung của SOAP Request quy ñịnh cụ thể cả tên phương thức và một danh sách các các tham số. SOAP response trả về từ dịch vụ thông tin thời tiết như sau[9]: <?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/09/soap-envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body><ns1:getWeatherResponse xmlns:ns1="urn:examples:weatherservice" SOAP-ENV:encodingStyle="http://www.w3.org/2001/09/soap- encoding/"> <return xsi:type="xsd:int">65</return>
</ns1:getWeatherResponse>
/SOAP-ENV:Body> </SOAP-ENV:Envelope>
Ví dụ 2.2.1.2: SOAP Request
2.2.2 ðặc tả SOAP
Các ñặc tả SOAP định nghĩa 3 phần chính[9]:
Envelope: Các định nghĩa Envelope xác định quy tắc đóng gói dữ liệu đang được truyền giữa các máy tính. Bao gồm các dữ liệu ñặc tả ứng dụng như tên phương thức thực hiện, các tham số, hoặc giá trị trả về. Nó cũng có thể bao gồm thơng tin về ai sẽ xử lý nội dung và trong trường hợp xảy ra lỗi thì cách mã hóa thơng điệp lỗi như thế nào.
Các quy tắc mã hóa dữ liệu: ðể trao ñổi dữ liệu, các máy tính phải thống nhất các quy tắc mơ tả mã hóa các kiểu dữ liệu. Ví dụ hai máy tính xử lý gía cổ phiếu cần thống nhất quy tắc cho việc mã hóa dữ liệu kiểu float; tương tự hai máy tính xử lý giá nhiều loại cổ phiếu cấn phải thống nhất quy tắc mã hóa mảng. Ví vậy SOAP bao gồm trong nó tập hợp các quy ước về mã hóa các kiểu dữ liệu. Hầu hết những quy ước đó dựa trên ñặc tả W3C XML schema.
52
RPC conventions: SOAP có thể được sử dụng trong hàng loạt các hệ thống thông tin một hoặc hai chiều. Với thơng tin hai chiều, SOAP định nghĩa một
quy ước ñơn giản ñể biểu diễn việc gọi các thủ tục từ xa và các phản hồi.
ðiều này cho phép một ứng dụng máy trạm xác ñịnh tên một phương thức từ xa, bao gồm số các tham số và nhận một phản hồi từ máy chủ.
Chúng ta xem xét mơ tả một giao thức SOAP, bắt đầu bằng cách trình diễn một quy ước SOAP đơn giản. Xmethoads.net cung cấp dịch vụ thông tin thời tiết, liệt kê danh sách nhiệt ñộ theo mã zip. Phương thức dịch vụ, getTemp, yêu cầu một chuỗi mã zip và trả về một giá trị float[8].
Hình 2.2.2 - Mơ tả mơ hình SOAP
2.2.3 SOAP Request
Yêu cầu từ máy trạm phải bao gồm tên của phương thức ñể thực hiện và các tham số ñược yêu cầu. Xét bản tin SOAP Request trong ví dụ 2.2.1.1.
Có một cặp phần tử rất quan trọng cần phải chú ý ở đây. Thứ nhất Request gồm có một phần tử <Envelope> bắt buộc, trong đó bao gồm một phần tử <Body> bắt buộc. Thứ hai tất cả có 4 Namespace được định nghĩa. Các Namespace được sử dụng ñể phân biệt các phần tử XML và các thuộc tính, và thường được sử dụng để tham chiếu các lược đồ bên ngồi. Trong ví dụ trên chúng ta sử dụng namespace ñể
phân biệt các ñịnh danh ñược kết hợp với SOAP
Envelope(http://schemas.xmlsoap.org/soap/envelope/), mã hóa dữ liệu bằng các XML schema (http://www.w3.org/2001/XMLSchema-instance và
http://www.w3.org/2001/XMLSchema), và các ñịnh danh ứng dụng cụ thể là dịch vụ (urn:examples:weatherservice). ðiều này cho phép mơ-dun hóa ứng dụng, trong
khi vẫn cung cấp sự mềm dẻo tối ña cho những thay ñổi ñặc tả trong tương lai. Phần tử <Body> đóng gói phần thân(payload) chính của thơng điệp SOAP. Chỉ có một phần tử là <getWeather> là gắn liền với namespace và tương ứng với tên phương thức từ xa. Mỗi tham số của phương thức xuất hiện trong một phần tử con. Trong trường hợp này chúng ta có phần tử <zipcode>, ñược gán với XML schema với kiểu dữ liệu xsd:string và giá trị là 10016[8].
2.2.4 SOAP Response
Từ ví dụ 2.2.1.1 và 2.2.1.2 ta thấy, cũng giống như SOAP Request, SOAP Response gồm các phần tử <Envelop> và <Body>, và 4 XML namespace. Tuy nhiên phần tử <Body> bao gồm một phần tử <getWeatherResponse>, tương ứng với yêu cầu ban ñầu. Như trên ta thấy nhiệt ñộ cho mã zip 10016 là 65 ñộ F[8].
2.3 Thơng điệp SOAP
Một thơng điệp một chiều là một yêu cầu từ máy trạm, hoặc một phản hồi từ máy chủ thơng thường nó ñược biết ñến như là một thông ñiệp SOAP. Mọi thơng điệp SOAP phải có từ khóa Envelop, khơng bắt buộc có phần tử Header, nhưng bắt buộc phải có phần tử Body. Những phần tử này được kết hợp với tập hợp các quy tắc, và để có thể debug được ứng dụng SOAP thì phải hiểu các quy tắc này.[8]
Hình 2.3 - Khn dạng thơng điệp SOAP
2.3.1 Envelope
Mọi thơng điệp SOAP đều có phần tử gốc Envelop. Khác với các ñặc tả khác, như HTTP và XML, SOAP khơng định nghĩa một mơ hình phiên bản truyền thống dựa trên số phiên bản phát hành chính và phụ(HTTP 1.0, HTTP1.1). SOAP
54
sử dụng SOAP namespace ñể ñánh dấu các phiên bản khác nhau. Phiên bản phải ñược tham chiếu trong phần tử <Envelope>. Ví dụ: <SOAP-ENV:Envelope xmlns:SOAP-NV=http://schemas.xmlsoap.org/soap/envelope/.
SOAP 1.1 namespace có URI là http://schemas.xmlsoap.org/soap/envelope/, trong khi ñó của SOAP 1.2 là http://www.w3.org/2001/09/soap-envelope. Nếu Envelop là một namespace bất kỳ, thì coi như là một lỗi phiên bản[8].
2.3.2 Header
Phần tử tùy chọn Header cung cấp một khuôn khổ linh hoạt cho việc bổ sung các yêu cầu ở cấp ứng dụng. ví dụ: phần tử Header có thể được sử dụng để xác định một chữ ký số cho dịch vụ bảo vệ bằng mật khẩu, giồng như vậy, nó có thể được sử dụng để xác ñịnh một số tài khoản của dịch vụ SOAP “pay-per-use”. Hiện tại có rất nhiều dịch vụ SOAP khơng sử dụng phần tử Header, nhưng các dịch vụ SOAP an tồn, thì Header cung cấp một bộ máy mở cho xác thực, quản lý giao dịch, và thanh toán ủy quyền[8].
Phần tử Header có hai thuộc tính:
- Actor: Giao thức SOAP ñịnh nghĩa một message path như một danh sách các nút dịch vụ SOAP. Mỗi một nút trung gian đó có thể thực hiện một vài xử lý và sau đó chuyển tiếp thơng điệp tới nút tiếp theo trong chuỗi. Bằng cách thiết lập thuộc tính này, máy trạm có thể chỉ rõ người nhận của SOAP header.
- MustUnderstand:Chỉ ñịnh một phần tử Header là tùy chọn hay bắt buộc. Nếu
ñặt là true, người nhận phải hiểu và xử lý thuộc tính Header tùy theo định
nghĩa của nó hoặc trả về lỗi. Header chỉ rõ tài khoản thanh tốn, nó phải được hiểu và xử lý bởi máy chủ SOAP như ví dụ sau:
<SOAP-ENV:Header><ns1:PaymentAccount xmlns:ns1="urn:ecerami" SOAP-ENV: mustUnderstand="true"> orsenigo473 </ns1:PaymentAccount > </SOAP-ENV:Header>.
2.3.3 Body
Phần tử Body là bắt buộc cho tất cả các thơng điệp SOAP. Như chúng ta ñã biết, sử dụng của các phần tử Body bao gồm cả RPC Request và Response[8].
2.3.4 Fault
Trong trường hợp một lỗi xảy ra, phần tử <Body> sẽ bao gồm phần tử <Fault>. Phần tử con lỗi ñược ñịnh nghĩa trong bảng 16 gồm có <faultCode>, <faultString>, <faultActor>, và chi tiết các phần tử. Các mã lỗi SOAP ñược ñịnh nghĩa trước trong bảng 17. Dưới ñây là một ví dụ về lỗi, máy trạm yêu cầu phương thức tên là ValidateCreditCard, nhưng dịch vụ không hỗ trợ. Dưới ñây là một yêu cầu máy trạm bị lỗi, và máy chủ trả về một phản hồi SOAP[8].
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode> <faultstring xsi:type="xsd:string">
Failed to locate method (ValidateCreditCard) in class (examplesCreditCard) at /usr/local/ActivePerl-5.6/lib/ site_perl/5.6.0/SOAP/Lite.pm line 1555.
</faultstring>
</SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Tên phần tử Mô tả
faultCode Mã xác ñịnh lớp xảy ra lỗi
faultString Mơ tả chi tiết lỗi để người quản trị có thế hiểu được. faultActor Chỉ rõ bộ phận nào là nguyên nhân xảy ra lỗi
Detail Mang thơng điệp lỗi của ứng dụng đặc biệt. có thể có phần tử con bên trong phần tử này
Bảng 2.3.4.1 - Mô tả các phần tử con trong phần tử fault
Tên Mô tả
SOAP-ENV:VersionMismatch Chỉ rõ phần tử Envelope có một namespace không hợp lệ
SOAP-ENV:MustUnderstand Người nhận khơng thể xử lý được Header SOAP-ENV:Client u cầu phía máy trạm lỗi
56
SOAP-ENV:Server Máy chủ khơng thể xử lý yêu cấu của máy trạm Bảng 2.3.4.2 - Mô tả các giá trị trong phần tử faultCode
2.3.5 SOAP Encoding
SOAP bao gồm một tập các quy tắc dựng sẵn để mã hóa các kiểu dữ liệu. Cho phép các thơng điệp SOAP chỉ ra các kiểu dữ liệu cụ thể như Integer, float, double, mảng. Hầu hết các quy tắc mã hóa được thực thi trực tiếp bởi công cụ SOAP, vì vậy ta khơng nhìn thấy. Tuy nhiên khi debug một ứng ta vẫn phải hiểu những cơ sở mã hóa của SOAP[8].
Các kiểu dữ liệu SOAP ñược chia thành hai loại: vô hướng và phức hợp. Kiểu vơ hướng chứa chính xác một giá trị, ví dụ như tên họ, giá, mô tả sản phẩm. Kiểu phức hợp chứa nhiều giá trị, ví dụ như hóa đơn mua hàng hoặc danh sách giá cổ phiếu. Kiểu phức hợp ñược chia thành các kiểu mảng và cấu trúc. Mảng chứa nhiều giá trị, nhưng mỗi phần tử ñược quy ñịnh bởi tên truy nhập. Thơng tin về kiểu mã hóa cho các thơng điệp SOAP thiết lập qua thuộc tính SOAP- ENV:encodingStyle. ðể sử dụng mã hóa SOAP 1.1, sử dụng giá trị[8].
http://schemas.xmlsoap.org/soap/encoding/.
ðể sử dụng mã hóa SOAP 1.2, sử dụng giá trị.
http://www.w3.org/2001/09/soap-encoding.
2.3.5.1 Kiểu vô hướng
Với kiểu vô hướng, SOAP thơng qua tất cả các kiểu đơn giản dựng sẵn ñược
xác ñịnh bởi ñặc tả XML Schema. Bao gồm các kiểu string, float, double, integer.
Bảng 2.3.5.1 - Các kiểu dựng sẵn
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 ngồ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