xà phòng XML
- SOAP là viết tắt của S imple O object Một giao thức truy cập
- SOAP là một giao thức truyền thông ứng dụng
- SOAP là một định dạng để gửi và nhận tin nhắn
- SOAP độc lập với nền tảng
- SOAP dựa trên XML
- SOAP là khuyến nghị của W3C
Tại sao là xà phòng?
Điều quan trọng là các ứng dụng web có thể giao tiếp qua Internet.
Cách tốt nhất để liên lạc giữa các ứng dụng là qua HTTP, vì HTTP được hỗ trợ bởi tất cả các trình duyệt và máy chủ Internet. SOAP được tạo ra để thực hiện điều này.
SOAP cung cấp cách giao tiếp giữa các ứng dụng chạy trên các hệ điều hành khác nhau, với các công nghệ và ngôn ngữ lập trình khác nhau.
Khối xây dựng SOAP
Thông báo SOAP là một tài liệu XML thông thường chứa các phần tử sau:
- Phần tử Envelope xác định tài liệu XML là thông báo SOAP
- Phần tử Tiêu đề chứa thông tin tiêu đề
- Phần tử Nội dung chứa thông tin cuộc gọi và phản hồi
- Phần tử Lỗi chứa lỗi và thông tin trạng thái
Tất cả các phần tử trên được khai báo trong không gian tên mặc định cho đường bao SOAP:
https://www.w3.org/2003/05/soap-envelope
và không gian tên mặc định cho các kiểu dữ liệu và mã hóa SOAP là:
https://www.w3.org/2003/05/soap-encoding
Quy tắc cú pháp
Dưới đây là một số quy tắc cú pháp quan trọng:
- Thông báo SOAP PHẢI được mã hóa bằng XML
- Một thông báo SOAP PHẢI sử dụng không gian tên SOAP Envelope
- Thông báo SOAP KHÔNG được chứa tham chiếu DTD
- Thông báo SOAP KHÔNG được chứa Hướng dẫn xử lý XML
Tin nhắn SOAP của bộ xương
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
Phần tử phong bì SOAP
Phần tử Phong bì SOAP được yêu cầu là phần tử gốc của thông báo SOAP. Phần tử này định nghĩa tài liệu XML như một thông báo SOAP.
Ví dụ
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
Không gian tên xmlns:soap
Lưu ý không gian tên xmlns:soap trong ví dụ trên. Nó phải luôn có giá trị: "https://www.w3.org/2003/05/soap-envelope".
Không gian tên xác định Phong bì là Phong bì SOAP.
Nếu sử dụng một không gian tên khác, ứng dụng sẽ phát sinh lỗi và loại bỏ thông báo.
Thuộc tính EncodingStyle
Thuộc tính EncodingStyle được sử dụng để xác định các kiểu dữ liệu được sử dụng trong tài liệu. Thuộc tính này có thể xuất hiện trên bất kỳ phần tử SOAP nào và áp dụng cho nội dung của phần tử đó cũng như tất cả các phần tử con.
Thông báo SOAP không có mã hóa mặc định.
Cú pháp
soap:encodingStyle=" URI "
Ví dụ
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
Phần tử tiêu đề SOAP
Phần tử Tiêu đề SOAP tùy chọn chứa thông tin dành riêng cho ứng dụng (như xác thực, thanh toán, v.v.) về thông báo SOAP.
Nếu có phần tử Header thì nó phải là phần tử con đầu tiên của phần tử Envelope.
Lưu ý: Tất cả các phần tử con trực tiếp của phần tử Header phải đủ tiêu chuẩn về không gian tên.
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.example.com.vn/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Ví dụ trên chứa tiêu đề có phần tử "Trans", thuộc tính "mustUnderstand" có giá trị là 1 và giá trị là 234.
SOAP xác định ba thuộc tính trong không gian tên mặc định. Các thuộc tính này là: mustUnderstand, diễn viên và EncodingStyle.
Các thuộc tính được xác định trong Tiêu đề SOAP xác định cách người nhận xử lý thông báo SOAP.
Thuộc tính mustUnderstand
Thuộc tính SOAP mustUnderstand có thể được sử dụng để cho biết mục nhập tiêu đề là bắt buộc hay tùy chọn để người nhận xử lý.
Nếu bạn thêm mustUnderstand="1" vào phần tử con của phần tử Tiêu đề thì điều đó cho biết rằng bộ thu xử lý Tiêu đề phải nhận ra phần tử đó. Nếu người nhận không nhận ra phần tử thì nó sẽ thất bại khi xử lý Tiêu đề.
Cú pháp
soap:mustUnderstand="0|1"
Ví dụ
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.example.com.vn/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Thuộc tính diễn viên
Một tin nhắn SOAP có thể di chuyển từ người gửi đến người nhận bằng cách chuyển các điểm cuối khác nhau dọc theo đường dẫn tin nhắn. Tuy nhiên, không phải tất cả các phần của thông báo SOAP đều có thể dành cho điểm cuối cuối cùng, thay vào đó, nó có thể dành cho một hoặc nhiều điểm cuối trên đường dẫn thông báo.
Thuộc tính tác nhân SOAP được sử dụng để định địa chỉ phần tử Tiêu đề tới một điểm cuối cụ thể.
Cú pháp
soap:actor=" URI "
Ví dụ
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.example.com.vn/transaction/"
soap:actor="https://www.example.com.vn/code/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Thuộc tính EncodingStyle
Thuộc tính EncodingStyle được sử dụng để xác định các kiểu dữ liệu được sử dụng trong tài liệu. Thuộc tính này có thể xuất hiện trên bất kỳ phần tử SOAP nào và nó sẽ áp dụng cho nội dung của phần tử đó cũng như tất cả các phần tử con.
Thông báo SOAP không có mã hóa mặc định.
Cú pháp
soap:encodingStyle=" URI "
Phần tử nội dung SOAP
Phần tử Nội dung SOAP được yêu cầu chứa thông báo SOAP thực tế dành cho điểm cuối cuối cùng của thông báo.
Các phần tử con ngay lập tức của phần tử Nội dung SOAP có thể đủ tiêu chuẩn về không gian tên.
Ví dụ
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="https://www.example.com.vn/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
Ví dụ trên yêu cầu giá táo. Lưu ý rằng các phần tử m:GetPrice và Item ở trên là các phần tử dành riêng cho ứng dụng. Chúng không phải là một phần của không gian tên SOAP.
Phản hồi SOAP có thể trông giống như thế này:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.example.com.vn/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
Phần tử lỗi SOAP
Phần tử SOAP Fault tùy chọn được sử dụng để chỉ ra các thông báo lỗi.
Phần tử SOAP Fault chứa các lỗi và thông tin trạng thái cho một thông báo SOAP.
Nếu có phần tử Lỗi, nó phải xuất hiện dưới dạng phần tử con của phần tử Nội dung. Phần tử Lỗi chỉ có thể xuất hiện một lần trong thông báo SOAP.
Phần tử Lỗi SOAP có các phần tử phụ sau:
Sub Element | Description |
---|---|
<faultcode> | A code for identifying the fault |
<faultstring> | A human readable explanation of the fault |
<faultactor> | Information about who caused the fault to happen |
<detail> |
Holds application specific error information related to the Body element |
Mã lỗi SOAP
Các giá trị mã lỗi được xác định bên dưới phải được sử dụng trong phần tử mã lỗi khi mô tả lỗi:
Error | Description |
---|---|
VersionMismatch | Found an invalid namespace for the SOAP Envelope element |
MustUnderstand | An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood |
Client | The message was incorrectly formed or contained incorrect information |
Server | There was a problem with the server so the message could not proceed |
Giao thức HTTP
HTTP giao tiếp qua TCP/IP. Máy khách HTTP kết nối với máy chủ HTTP bằng TCP. Sau khi thiết lập kết nối, máy khách có thể gửi thông báo yêu cầu HTTP đến máy chủ:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
Sau đó, máy chủ xử lý yêu cầu và gửi phản hồi HTTP trở lại máy khách. Phản hồi chứa mã trạng thái cho biết trạng thái của yêu cầu:
200 OK
Content-Type: text/plain
Content-Length: 200
Trong ví dụ trên, máy chủ trả về mã trạng thái là 200. Đây là mã thành công tiêu chuẩn cho HTTP.
Nếu máy chủ không thể giải mã yêu cầu, nó có thể trả về kết quả như thế này:
400 Bad Request
Content-Length: 0
Ràng buộc xà phòng
Đặc tả SOAP xác định cấu trúc của các thông báo SOAP chứ không phải cách chúng được trao đổi. Khoảng trống này được lấp đầy bởi cái được gọi là "Ràng buộc SOAP". Các ràng buộc SOAP là các cơ chế cho phép các thông điệp SOAP được trao đổi một cách hiệu quả bằng cách sử dụng giao thức truyền tải.
Hầu hết việc triển khai SOAP đều cung cấp các ràng buộc cho các giao thức truyền tải phổ biến, chẳng hạn như HTTP hoặc SMTP.
HTTP đồng bộ và được sử dụng rộng rãi. Yêu cầu HTTP SOAP chỉ định ít nhất hai tiêu đề HTTP: Loại nội dung và Độ dài nội dung.
SMTP không đồng bộ và được sử dụng trong trường hợp cuối cùng hoặc trường hợp cụ thể.
Việc triển khai SOAP bằng Java thường cung cấp một ràng buộc cụ thể cho giao thức JMS (Hệ thống nhắn tin Java).
Loại nội dung
Tiêu đề Kiểu nội dung cho yêu cầu và phản hồi SOAP xác định loại MIME cho thông báo và mã hóa ký tự (tùy chọn) được sử dụng cho nội dung XML của yêu cầu hoặc phản hồi.
Cú pháp
Content-Type: MIMEType; charset=character-encoding
Ví dụ
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Thời lượng nội dung
Tiêu đề Độ dài nội dung cho yêu cầu và phản hồi SOAP chỉ định số byte trong nội dung của yêu cầu hoặc phản hồi.
Cú pháp
Content-Length: bytes
Ví dụ
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
Một ví dụ về SOAP
Trong ví dụ bên dưới, yêu cầu GetStockprice được gửi đến máy chủ. Yêu cầu có tham số StockName và tham số Price sẽ được trả về trong phản hồi. Không gian tên cho hàm được xác định trong "https://www.example.org/stock".
Một yêu cầu SOAP:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="https://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
Phản hồi SOAP:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="https://www.w3.org/2003/05/soap-envelope"
soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="https://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>