Hướng dẫn dịch vụ web SOAP: Giao thức SOAP là gì? VÍ DỤ
SOAP là gì?
SOAP là một giao thức dựa trên XML để truy cập các dịch vụ web qua HTTP. Nó có một số đặc điểm kỹ thuật có thể được sử dụng trên tất cả các ứng dụng.
SOAP được gọi là Giao thức truy cập đối tượng đơn giản, nhưng sau này được rút gọn thành SOAP v1.2. SOAP là một giao thức hay nói cách khác là định nghĩa về cách các dịch vụ web giao tiếp với nhau hoặc giao tiếp với các ứng dụng khách hàng gọi chúng.
SOAP được phát triển như một ngôn ngữ trung gian để các ứng dụng được xây dựng trên nhiều ngôn ngữ lập trình khác nhau có thể giao tiếp dễ dàng với nhau và tránh được nỗ lực phát triển quá mức.
Giới thiệu SOAP
Trong thế giới ngày nay, có rất nhiều ứng dụng được xây dựng trên các ngôn ngữ lập trình khác nhau. Ví dụ: có thể có một ứng dụng web được thiết kế bằng Java, cái khác ở .Net và cái khác ở PHP.
Việc trao đổi dữ liệu giữa các ứng dụng là rất quan trọng trong thế giới mạng ngày nay. Nhưng việc trao đổi dữ liệu giữa các ứng dụng không đồng nhất này sẽ phức tạp. Tương tự như vậy, độ phức tạp của mã để thực hiện việc trao đổi dữ liệu này cũng vậy.
Một trong những phương pháp được sử dụng để giải quyết sự phức tạp này là sử dụng XML (Ngôn ngữ đánh dấu mở rộng) làm ngôn ngữ trung gian để trao đổi dữ liệu giữa các ứng dụng.
Mọi ngôn ngữ lập trình đều có thể hiểu được ngôn ngữ đánh dấu XML. Do đó, XML được sử dụng làm phương tiện cơ bản để trao đổi dữ liệu.
Nhưng không có thông số kỹ thuật tiêu chuẩn nào về việc sử dụng XML trên tất cả các ngôn ngữ lập trình để trao đổi dữ liệu. Đó là lúc phần mềm SOAP xuất hiện.
SOAP được thiết kế để hoạt động với XML qua HTTP và có một số loại thông số kỹ thuật có thể được sử dụng trên tất cả các ứng dụng. Chúng ta sẽ tìm hiểu thêm chi tiết về giao thức SOAP trong các chương tiếp theo.
Ưu điểm của SOAP
SOAP là giao thức được sử dụng để trao đổi dữ liệu giữa các ứng dụng. Dưới đây là một số lý do tại sao SOAP được sử dụng.
- Khi phát triển các dịch vụ Web dựa trên SOAP, bạn cần có một số ngôn ngữ có thể được sử dụng cho các dịch vụ web để giao tiếp với các ứng dụng khách. SOAP là phương tiện hoàn hảo được phát triển để đạt được mục đích này. Giao thức này cũng được khuyến nghị bởi tập đoàn W3C, cơ quan quản lý tất cả các tiêu chuẩn web.
- SOAP là một giao thức nhẹ được sử dụng để trao đổi dữ liệu giữa các ứng dụng. Lưu ý từ khóa 'ánh sáng.' Vì lập trình SOAP dựa trên ngôn ngữ XML, ngôn ngữ này là ngôn ngữ trao đổi dữ liệu nhẹ, do đó SOAP là một giao thức cũng thuộc cùng loại.
- SOAP được thiết kế để độc lập với nền tảng và cũng được thiết kế để độc lập với hệ điều hành. Vì vậy, giao thức SOAP có thể hoạt động với mọi ứng dụng dựa trên ngôn ngữ lập trình trên cả hai Windows và Linux nền tảng.
- Nó hoạt động trên giao thức HTTP –SOAP hoạt động trên giao thức HTTP, đây là giao thức mặc định được sử dụng bởi tất cả các ứng dụng web. Do đó, không cần có loại tùy chỉnh nào để chạy các dịch vụ web được xây dựng trên giao thức SOAP để hoạt động trên World Wide Web.
Khối xây dựng SOAP
Đặc tả SOAP định nghĩa một cái gì đó được gọi là “tin nhắn SOAP” đó là những gì được gửi đến dịch vụ web và ứng dụng khách.
Sơ đồ kiến trúc SOAP bên dưới cho thấy các khối xây dựng khác nhau của một tin nhắn SOAP.
Thông báo SOAP không gì khác ngoài một tài liệu XML đơn thuần có các thành phần bên dưới.
- Một phần tử Envelope xác định tài liệu XML là một thông điệp SOAP – Đây là phần chứa thông điệp SOAP và được sử dụng để đóng gói tất cả các chi tiết trong thông điệp SOAP. Đây là phần tử gốc trong thông điệp SOAP.
- Một phần tử Header chứa thông tin header – Phần tử header có thể chứa thông tin như thông tin xác thực có thể được sử dụng bởi ứng dụng gọi. Nó cũng có thể chứa định nghĩa của các kiểu phức tạp có thể được sử dụng trong tin nhắn SOAP. Theo mặc định, tin nhắn SOAP có thể chứa các tham số có thể là các kiểu đơn giản như chuỗi và số, nhưng cũng có thể là một kiểu đối tượng phức tạp.
Một ví dụ về dịch vụ SOAP đơn giản thuộc loại phức tạp được hiển thị bên dưới.
Giả sử chúng tôi muốn gửi một loại dữ liệu có cấu trúc có sự kết hợp giữa “Tên hướng dẫn” và “Hướng dẫn Description,” thì chúng ta sẽ định nghĩa kiểu phức hợp như được hiển thị bên dưới.
Kiểu phức tạp được xác định bởi thẻ phần tử . Tất cả các thành phần cần thiết của cấu trúc cùng với các kiểu dữ liệu tương ứng của chúng sau đó được định nghĩa trong bộ sưu tập kiểu phức hợp.
<xsd:complexType> <xsd:sequence> <xsd:element name="Tutorial Name" type="string"/> <xsd:element name="Tutorial Description" type="string"/> </xsd:sequence> </xsd:complexType>
- Một phần tử Body chứa thông tin gọi và phản hồi – Phần tử này chứa dữ liệu thực tế cần được gửi giữa dịch vụ web và ứng dụng gọi. Dưới đây là ví dụ về dịch vụ web SOAP của phần thân SOAP thực sự hoạt động trên kiểu phức tạp được xác định trong phần tiêu đề. Sau đây là phản hồi của Tên hướng dẫn và Hướng dẫn Description được gửi đến ứng dụng gọi điện sẽ gọi dịch vụ web này.
<soap:Body> <GetTutorialInfo> <TutorialName>Web Services</TutorialName> <TutorialDescription>All about web services</TutorialDescription> </GetTutorialInfo> </soap:Body>
Cấu trúc thông báo SOAP
Một điều cần lưu ý là các thông báo SOAP thường được dịch vụ web tự động tạo khi nó được gọi.
Bất cứ khi nào ứng dụng khách gọi một phương thức trong dịch vụ web, dịch vụ web sẽ tự động tạo một thông báo SOAP có chứa các chi tiết cần thiết về dữ liệu sẽ được gửi từ dịch vụ web đến ứng dụng khách.
Như đã thảo luận trong chủ đề trước của hướng dẫn SOAP này, một Tin nhắn SOAP đơn giản có các thành phần sau –
- Yếu tố phong bì
- Phần tử tiêu đề và
- Yếu tố cơ thể
- Phần tử Lỗi (Tùy chọn)
Hãy xem ví dụ bên dưới về một thông báo SOAP đơn giản và xem phần tử thực sự làm gì.
- Như đã thấy trong thông báo SOAP ở trên, phần đầu tiên của thông báo SOAP là phần tử phong bì được sử dụng để đóng gói toàn bộ thông báo SOAP.
- Phần tử tiếp theo là phần thân SOAP chứa thông tin chi tiết của tin nhắn thực tế.
- Tin nhắn của chúng tôi chứa một dịch vụ web có tên “Guru99WebService”.
- “Guru99Webservice” chấp nhận tham số thuộc loại 'int' và có tên là TutorialID.
Bây giờ, thông báo SOAP ở trên sẽ được chuyển giữa dịch vụ web và ứng dụng khách.
Bạn có thể thấy thông tin trên hữu ích như thế nào đối với ứng dụng khách. Thông báo SOAP cho ứng dụng khách biết tên của dịch vụ Web là gì, cũng như những thông số mà nó mong đợi cũng như loại của từng tham số được dịch vụ web lấy.
Phần tử phong bì SOAP
Phần đầu tiên của khối xây dựng là Phong bì SOAP.
SOAP Envelope được sử dụng để đóng gói tất cả các chi tiết cần thiết của tin nhắn SOAP được trao đổi giữa dịch vụ web và ứng dụng khách.
Phần tử đường bao SOAP được sử dụng để chỉ ra phần đầu và phần cuối của thông báo SOAP. Điều này cho phép ứng dụng khách gọi dịch vụ web biết khi nào thông báo SOAP kết thúc.
Những điểm sau đây có thể được lưu ý về phần tử phong bì SOAP.
- Mọi thông báo SOAP cần phải có phần tử Envelope gốc. Thông báo SOAP hoàn toàn bắt buộc phải có phần tử phong bì.
- Mỗi phần tử Envelope cần phải có ít nhất một phần tử xà phòng.
- Nếu phần tử Phong bì chứa phần tử tiêu đề thì phần tử đó không được chứa nhiều hơn một phần tử và nó phải xuất hiện dưới dạng phần tử con đầu tiên của Phong bì, trước phần tử nội dung.
- Phong bì thay đổi khi phiên bản SOAP thay đổi.
- Bộ xử lý SOAP tương thích v1.1 tạo ra lỗi khi nhận được thông báo chứa không gian tên phong bì v1.2.
- Bộ xử lý SOAP tương thích v1.2 tạo ra lỗi Phiên bản không khớp nếu nó nhận được thông báo không bao gồm không gian tên phong bì v1.2.
Dưới đây là ví dụ về API SOAP của phiên bản 1.2 của phần tử đường bao SOAP.
<?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope" SOAP-ENV:encodingStyle=" http://www.w3.org/2001/12/soap-encoding"> <soap:Body> <Guru99WebService xmlns="http://tempuri.org/"> <TutorialID>int</TutorialID> </Guru99WebService> </soap:Body> </SOAP-ENV:Envelope>
Thông báo lỗi
Khi một yêu cầu được gửi tới dịch vụ web SOAP, phản hồi được trả về có thể có 2 dạng là phản hồi thành công hoặc phản hồi lỗi. Khi tạo thành công, phản hồi từ máy chủ sẽ luôn là thông báo SOAP. Nhưng nếu lỗi SOAP được tạo ra, chúng sẽ được trả về dưới dạng lỗi “HTTP 500”.
Thông báo lỗi SOAP bao gồm các thành phần sau.
- – Đây là mã chỉ định mã lỗi. Mã lỗi có thể là một trong các giá trị dưới đây
- SOAP-ENV:VersionMismatch – Đây là khi gặp phải một không gian tên không hợp lệ cho phần tử Phong bì SOAP.
- SOAP-ENV:MustUnderstand – Phần tử con ngay lập tức của phần tử Tiêu đề, với thuộc tính mustUnderstand được đặt thành “1”, không được hiểu.
- SOAP-ENV:Client – Tin nhắn được tạo không chính xác hoặc chứa thông tin không chính xác.
- SOAP-ENV:Server – Đã xảy ra sự cố với máy chủ nên tin nhắn không thể tiếp tục.
- – Đây là tin nhắn văn bản mô tả chi tiết về lỗi.
- (Không bắt buộc)– Đây là một chuỗi văn bản cho biết ai đã gây ra lỗi.
- (Không bắt buộc) – Đây là thành phần dành cho các thông báo lỗi dành riêng cho ứng dụng. Vì vậy, ứng dụng có thể có thông báo lỗi cụ thể cho các tình huống logic nghiệp vụ khác nhau.
Ví dụ về thông báo lỗi
Một ví dụ về thông báo lỗi được đưa ra dưới đây. Lỗi được tạo ra nếu tình huống trong đó máy khách cố gắng sử dụng một phương thức có tên là TutorialID trong lớp GetTutorial.
Thông báo lỗi bên dưới được tạo trong trường hợp phương thức không tồn tại trong lớp được xác định.
<?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> <SOAP-ENV:Fault> <faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode> <faultstring xsi:type="xsd:string"> Failed to locate method (GetTutorialID) in class (GetTutorial) </faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Đầu ra:
Khi bạn thực thi đoạn mã trên, nó sẽ hiển thị lỗi như “Không thể định vị phương thức (GetTutorialID) trong lớp (GetTutorial)”
Mô hình truyền thông SOAP
Mọi giao tiếp bằng SOAP đều được thực hiện thông qua giao thức HTTP. Trước SOAP, rất nhiều các dịch vụ web đã sử dụng kiểu RPC (Cuộc gọi thủ tục từ xa) tiêu chuẩn để liên lạc. Đây là kiểu giao tiếp đơn giản nhất nhưng có rất nhiều hạn chế.
Bây giờ trong hướng dẫn API SOAP này, hãy xem xét sơ đồ bên dưới để xem cách giao tiếp này hoạt động như thế nào. Trong ví dụ này, giả sử máy chủ lưu trữ một dịch vụ web cung cấp 2 phương thức là
- Nhận nhân viên – Điều này sẽ lấy được tất cả thông tin chi tiết của Nhân viên
- SetEmployee – Thao tác này sẽ thiết lập giá trị của các chi tiết như phòng ban nhân viên, lương, v.v. cho phù hợp.
Trong giao tiếp kiểu RPC thông thường, máy khách sẽ chỉ gọi các phương thức trong yêu cầu của nó và gửi các tham số cần thiết đến máy chủ, sau đó máy chủ sẽ gửi phản hồi mong muốn.
Mô hình truyền thông trên có những hạn chế nghiêm trọng dưới đây
- Không độc lập về ngôn ngữ – Máy chủ lưu trữ các phương thức sẽ bằng ngôn ngữ lập trình cụ thể và thông thường các cuộc gọi đến máy chủ sẽ chỉ bằng ngôn ngữ lập trình đó.
- Không phải giao thức chuẩn – Khi thực hiện cuộc gọi đến quy trình từ xa, cuộc gọi sẽ không được thực hiện thông qua giao thức chuẩn. Đây là một vấn đề vì hầu hết mọi giao tiếp qua web đều phải được thực hiện thông qua giao thức HTTP.
- Tường lửa – Vì các cuộc gọi RPC không đi qua giao thức thông thường nên cần mở các cổng riêng biệt trên máy chủ để cho phép máy khách giao tiếp với máy chủ. Thông thường tất cả các tường lửa sẽ chặn loại lưu lượng truy cập này và thường cần rất nhiều cấu hình để đảm bảo rằng loại liên lạc này giữa máy khách và máy chủ sẽ hoạt động.
Để khắc phục tất cả các hạn chế nêu trên, SOAP sẽ sử dụng mô hình giao tiếp bên dưới
- Máy khách sẽ định dạng thông tin liên quan đến lệnh gọi thủ tục và mọi đối số thành thông báo SOAP và gửi nó đến máy chủ như một phần của yêu cầu HTTP. Quá trình đóng gói dữ liệu vào thông điệp SOAP này được gọi là Marshalling.
- Sau đó, máy chủ sẽ mở gói tin nhắn do máy khách gửi, xem máy khách yêu cầu gì rồi gửi phản hồi thích hợp lại cho máy khách dưới dạng tin nhắn SOAP. Việc mở gói yêu cầu được gửi bởi client được gọi là Sắp xếp lại.
Ví dụ SOAP thực tế
Bây giờ trong hướng dẫn SoapUI này, chúng ta hãy xem một ví dụ SOAP thực tế,
Có lẽ một trong những cách tốt nhất để xem các thông báo SOAP được tạo ra như thế nào là thực sự quan sát hoạt động của một dịch vụ web.
Chủ đề này sẽ xem xét việc sử dụng Microsoft.Net framework để xây dựng dịch vụ web ASMX. Loại dịch vụ web này hỗ trợ cả phiên bản SOAP 1.1 và phiên bản 1.2.
Các dịch vụ web ASMX tự động tạo ra Ngôn ngữ định nghĩa dịch vụ web (WSDL) tài liệu. Tài liệu WSDL này được yêu cầu bởi ứng dụng khách đang gọi để ứng dụng biết dịch vụ web có khả năng thực hiện những gì.
Trong ví dụ của chúng tôi, chúng tôi sẽ tạo một dịch vụ web đơn giản, dịch vụ này sẽ được sử dụng để trả về một chuỗi cho ứng dụng gọi dịch vụ web.
Dịch vụ web này sẽ được lưu trữ trong một Asp.Net ứng dụng web. Sau đó chúng ta sẽ gọi dịch vụ web và xem kết quả được dịch vụ web trả về.
Visual Studio cũng sẽ cho chúng ta thấy thông điệp SOAP được truyền giữa dịch vụ web và ứng dụng gọi.
Điều kiện tiên quyết đầu tiên để thiết lập ứng dụng dịch vụ Web của chúng tôi có thể được thực hiện bằng cách làm theo các bước dưới đây.
Hãy đảm bảo rằng bạn đã cài đặt Visual Studio 2013 trên hệ thống của mình để thực hiện ví dụ này.
Bước 1) Bước đầu tiên là tạo một ứng dụng Web ASP.Net trống. Từ Visual Studio 2013, nhấp vào tùy chọn menu File->New project.
Khi bạn nhấp vào tùy chọn New Project, Visual Studio sẽ cung cấp cho bạn một hộp thoại khác để chọn loại dự án và cung cấp các chi tiết cần thiết của dự án. Điều này được giải thích trong bước tiếp theo.
Bước 2) Trong bước này,
- Trước tiên hãy đảm bảo chọn C# mẫu web của ứng dụng Web ASP.NET. Dự án phải thuộc loại này để tạo dự án dịch vụ SOAP. Bằng cách chọn tùy chọn này, Visual Studio sẽ thực hiện các bước cần thiết để thêm các tệp cần thiết mà bất kỳ ứng dụng dựa trên web nào cũng yêu cầu.
- Đặt tên cho dự án của bạn, trong trường hợp của chúng tôi là webservice.asmx. Sau đó, đảm bảo cung cấp vị trí nơi các tệp dự án sẽ được lưu trữ.
Khi hoàn tất, bạn sẽ thấy tệp dự án được tạo trong trình khám phá giải pháp của Visual Studio 2013.
Bước 3) Trong bước này,
Chúng tôi sẽ thêm một tệp dịch vụ Web vào dự án của chúng tôi
- Đầu tiên Nhấp chuột phải vào tệp dự án như hiển thị bên dưới
- Sau khi nhấp chuột phải vào tệp dự án, bạn có cơ hội chọn tùy chọn “Thêm-> Dịch vụ web (ASMX) để thêm tệp dịch vụ web. Chỉ cần cung cấp tên Dịch vụ hướng dẫn cho tệp tên dịch vụ web.
Bước 4) Thêm mã sau vào tệp asmx Dịch vụ hướng dẫn của bạn.
Giải thích mã:
- Dòng mã này cung cấp tên cho tệp dịch vụ web của bạn. Đây là một bước quan trọng vì nó nhường chỗ cho ứng dụng khách gọi dịch vụ web thông qua tên của dịch vụ web.
- Thông thường, một tệp lớp được sử dụng để đóng gói chức năng của dịch vụ web. Vì vậy, tệp lớp sẽ có định nghĩa của tất cả các phương thức web sẽ cung cấp một số chức năng cho ứng dụng khách.
- Ở đây [WebMethod] được biết đến như một thuộc tính mô tả một hàm. Bước tiếp theo sẽ tạo một hàm có tên là “Guru99WebService”, nhưng với việc bao gồm bước thêm thuộc tính [WebMethod] này sẽ đảm bảo rằng ứng dụng khách có thể gọi phương thức này. Nếu thuộc tính này không được đặt đúng chỗ thì ứng dụng khách không bao giờ có thể gọi được phương thức này.
- Ở đây chúng ta đang xác định một hàm có tên 'Guru99WebService' sẽ được sử dụng để trả về một chuỗi cho ứng dụng khách đang gọi. Chức năng này là một dịch vụ web có thể được gọi bởi bất kỳ ứng dụng khách nào.
- Chúng tôi đang sử dụng câu lệnh return để trả về chuỗi “Đây là dịch vụ Web Guru99” cho ứng dụng khách.
Nếu mã được thực thi thành công, kết quả sau sẽ hiển thị khi bạn chạy mã trên trình duyệt.
Đầu ra:
- Kết quả đầu ra cho thấy rõ rằng tên dịch vụ web của chúng tôi là “Dịch vụ web Guru99”, đây là kết quả của việc đặt tên cho dịch vụ web của chúng tôi.
- Chúng ta cũng có thể thấy rằng chúng ta có thể gọi dịch vụ web. Nếu chúng ta nhấp vào nút Gọi, chúng ta sẽ nhận được phản hồi bên dưới trong trình duyệt web.
Đầu ra trên,
- Nó cho thấy rõ ràng rằng bằng cách gọi phương thức web, chuỗi “Đây là dịch vụ Web Guru99” sẽ được trả về.
- Visual Studio cũng cho phép bạn xem yêu cầu và phản hồi tin nhắn SOAP được tạo ra khi dịch vụ web trên được gọi.
Yêu cầu SOAP được tạo khi dịch vụ web được gọi được hiển thị bên dưới.
Giải thích mã:
- Phần đầu tiên của thông báo SOAP là phần tử phong bì, phần tử này đã được thảo luận trong các chương trước. Đây là phần tử đóng gói có trong mọi thông báo SOAP.
- Thân SOAP là phần tử tiếp theo và chứa thông tin chi tiết thực tế của tin nhắn SOAP.
- Phần thứ ba là phần tử chỉ định rằng chúng tôi muốn gọi dịch vụ có tên là 'Guru99WebService.'
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soap:Body> <Guru99WebServiceResponse xmlns="http://tempuri.org/"> <Guru99WebServiceResult>string</Guru99WebServiceResult> </Guru99WebServiceResponse> </soap:Body> </soap:Envelope>
Giải thích mã:
- Phần đầu tiên của thông báo SOAP là phần tử phong bì, phần tử này đã được thảo luận trong các chương trước. Đây là phần tử đóng gói có trong mọi thông báo SOAP.
- Thân SOAP là phần tử tiếp theo và chứa thông tin chi tiết thực tế của tin nhắn SOAP.
- Phần thú vị mà bạn sẽ thấy bây giờ là thuộc tính 'string'. Thuộc tính này cho ứng dụng khách biết rằng dịch vụ web được gọi trả về một đối tượng có kiểu chuỗi. Điều này rất hữu ích vì nếu không thì ứng dụng khách sẽ không biết dịch vụ web trả về cái gì.
Tổng kết
- SOAP là một giao thức được sử dụng để trao đổi dữ liệu giữa các ứng dụng được xây dựng trên các nền tảng khác nhau. ngôn ngữ lập trình.
- SOAP được xây dựng dựa trên đặc tả XML và hoạt động với giao thức HTTP. Điều này làm cho nó trở nên hoàn hảo để sử dụng trong các ứng dụng web.
- Các khối xây dựng SOAP bao gồm một Thông báo SOAP. Mỗi thông báo SOAP bao gồm một phần tử phong bì, một tiêu đề và một phần tử nội dung.
- Phần tử phong bì là phần tử bắt buộc trong thông báo SOAP và được sử dụng để đóng gói tất cả dữ liệu trong thông báo SOAP.
- Phần tử tiêu đề có thể được sử dụng để chứa thông tin như thông tin xác thực hoặc định nghĩa các kiểu dữ liệu phức tạp.
- Phần tử body là phần tử chính chứa định nghĩa của các phương thức web cùng với bất kỳ thông tin tham số nào nếu được yêu cầu.