SOAP (Simple Object Access Protocol)

Một phần của tài liệu Nghiên cứu JM và xây dựng ứng dụng minh họa (Đặng Nguyễn Kim Anh vs Đào Anh Tuấn) - 3 potx (Trang 51 - 56)

Chương 8: Giới thiệu Web Service

8.3.1.SOAP (Simple Object Access Protocol)

SOAP là một giao thức đơn giản nhằm mục đích trao đổi thông tin trong môi trường ứng dụng phân tán. SOAP dựa trên nền công nghệ XML và bao gồm 2 thành phần:

• Một “bì thư” (envelope) để quản lý các thông tin mở rộng và mang tính điều khiển.

• Một chuẩn mã hóa quy định cách thể hiện thông tin trong envelope.

SOAP có thể được sử dụng kết hợp với các giao thức chuẩn khác như SMTP,HTTP/HTTPS,FTP… Tuy nhiên hiện nay chỉ mới có HTTP/HTTPS được xem như giao thức chuẩn để trao đổi gói tin SOAP. Việc sử dụng SOAP như một giao thức trao đổi dữ liệu chuẩn khiến web service có khả năng hoạt động trên nhiều môi trường lập trình khác nhau như Java, .NET,…

Gói tin SOAP:

Gói tin SOAP là một phương tiện giao tiếp một chiều từ nơi gửi đến nơi nhận. Gói tin SOAP được gửi bên trong một gói tin HTTP request hoặc gói tin HTTP response.

Java Mobile

• Phần bì thư SOAP envelope: định nghĩa thông điệp chứa những gì, ai nên xử lý thông điệp, thông điệp này bắt buộc phải xử lý (mandatory) hay mang tính tùy chọn (optional).

• Luật mã hóa: Quy định cách thức chuyển đổi thông tin, các kiểu dữ liệu trong ứng dụng.

• Phần SOAP RPC: mô tả những qui luật về cách thức gọi hàm từ xa cũng như cách thức phản hồi.

• Qui luật mô tả cách thức sử dụng gói tin SOAP với các protocol tầng dưới (hiện nay là HTTP).

Cấu trúc gói tin SOAP: một gói tin SOAP gồm một Envelope như một node gốc trong văn bản XML, nút gốc này sẽ chứa node con Body và có thể có hoặc không chứa node con Header.

SOAP Envelope:

Phần Envelope là node gốc của gói tin SOAP dưới dạng tài liệu XML. Phần Envelope có thể có hoặc không có phần Header nhưng chắc chắn phải chứa phần Body. Đây là một ví dụ về Envelope: <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:Envelope>

Trong các gói tin SOAP thông thường, phần Envelope không mang nhiều ý nghĩa. Nó chỉ đơn thuần báo hiệu sự bắt đầu của một gói tin và định nghĩa các NameSpace cần thiết sẽ được sử dụng ở các phần sau.

Java Mobile

Phần SOAP Header sẽ là node con đầu tiên của SOAP Envelope. Phần Header thường là nơi được dùng để thêm các thông tin bổ sung phục vụ cho mục đích riêng của chương trình. Các thông tin thường được thêm vào phần Header là authentication, authorization, quản lý transaction… Phần Header không bắt buộc phải có trong mọi gói tin SOAP.

SOAP Body:

Nếu trong gói tin SOAP không có node Header thì node Body phải là node con đầu tiên của SOAP Envelope.

Trong mục Body có thể có nhiều node con, được gọi chung là mẫu tin Body. Phần Body chứa các thông tin về lời gọi hàm, ví dụ như tên hàm cần gọi, các tham số đầu vào, giá trị trả về … để phục vụ cho việc gọi hàm từ xa.

Đây là một ví dụ hoàn chỉnh và đơn giản về việc sử dụng SOAP để gọi hàm GetAccount(int accNumber) với tham số truyền vào accNumber=1234. Gói tin SOAP được đặt trong gói tin HTTP Request có dạng như sau:

POST /dummy/service1.asmx HTTP/1.1

Host: 192.168.0.80

Content-Type: text/xml; charset=utf-8 Content-Length: 215

SOAPAction: "http://woodgrovebank.com/GetAccount" <?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetAccount xmlns="http://woodgrovebank.com"> <acctNumber>1234</acctNumber> </GetAccount>

Java Mobile

</soap:Body> </soap:Envelope>

Phần trên là nội dung gói tin HTTP Request dạng POST, trong gói tin này chứa lời gọi đến hàm GetAccount(int accNumber) dưới dạng một gói tin SOAP.

Việc hiểu cấu trúc SOAP chủ yếu phục vụ cho việc debug ứng dụng hoặc xây dựng các ứng dụng cần sự can thiệp ở mức sâu đến các protocol bên dưới. Đối với các chương trình thông thường hiếm khi chúng ta phải thao tác với gói tin SOAP.

Đây là nội dung gói tin SOAP phản hồi cho lời gọi hàm trên, chỉ ra kết quả lời gọi hàm là 5250.00

HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8 Content-Length: 247 <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetAccountResponse xmlns="http://woodgrovebank.com"> <savingsAcct> <balance>5250.00</balance> </savingsAcct> </GetAccountResponse> </soap:Body> </soap:Envelope> SOAP Fault:

Java Mobile

Như đã đề cập, một trong những vấn đề đặt ra trong môi trường ứng dụng phân tán là khả năng xảy ra lỗi cao; do đó khái niệm SOAP Fault được đề ra để vận chuyển các thông báo lỗi trong quá trình hoạt động.

HTTP/1.0 500 Internal Server Error Content-Length: 460

Content-Type: text/xml; charset="utf-8" <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/”> <soap:Body> <soap:Fault> <faultcode>123XYZ</faultcode> <faultstring>Server Error</faultstring> <detail> <bank:faultdetails xmlns:bank="urn:OnlineBank"> <message>Your account is overdrawn</message> <errorcode>1234</errorcode> </bank:faultdetails> </detail> </soap:Fault> </soap:Body> </soap:Envelope>

Soap Fault có những phần con như faultcode, faultstring, faultactor, faultdetail để cung cấp những thông tin chi tiết khi có lỗi phát sinh. Trong những môi trường lập trình cao cấp như Java, .NET, khi soap fault phát sinh thì một ngoại lệ (Exception) cũng được phát sinh để báo cho lập trình viên có xử lý tương ứng.

Java Mobile

Một phần của tài liệu Nghiên cứu JM và xây dựng ứng dụng minh họa (Đặng Nguyễn Kim Anh vs Đào Anh Tuấn) - 3 potx (Trang 51 - 56)