Hướng dẫn WSDL: Dịch vụ web DescriptNgôn ngữ ion với ví dụ

WSDL là gì?

Dịch vụ website Descriptngôn ngữ ion (WSDL) là một tệp dựa trên XML về cơ bản cho ứng dụng khách biết dịch vụ web làm gì. Tệp WSDL được sử dụng để mô tả ngắn gọn những gì dịch vụ web thực hiện và cung cấp cho khách hàng tất cả thông tin cần thiết để kết nối với dịch vụ web và sử dụng tất cả chức năng do dịch vụ web cung cấp.

Trong hướng dẫn này, chúng ta sẽ tập trung vào điểm cuối cùng, phần quan trọng nhất của dịch vụ web và đó là WSDL hoặc ngôn ngữ mô tả dịch vụ Web.

Tệp WSDL được sử dụng để mô tả ngắn gọn những gì dịch vụ web thực hiện và cung cấp cho khách hàng tất cả thông tin cần thiết để kết nối với dịch vụ web và sử dụng tất cả chức năng do dịch vụ web cung cấp.

Cấu trúc của tài liệu WSDL

Tài liệu WSDL được sử dụng để mô tả một dịch vụ web. Mô tả này là bắt buộc để các ứng dụng khách có thể hiểu được dịch vụ web thực sự làm gì.

  • Tệp WSDL chứa vị trí của dịch vụ web và
  • Các phương thức được dịch vụ web đưa ra.

Bản thân tệp WSDL có thể trông rất phức tạp đối với bất kỳ người dùng nào, nhưng nó chứa tất cả thông tin cần thiết mà bất kỳ ứng dụng khách nào cũng yêu cầu để sử dụng dịch vụ web có liên quan.

Dưới đây là cấu trúc chung của tệp WSDL

  • Định nghĩa
  • TargetKhông gian tên
  • Loại dữ liệu
  • Tin nhắn
  • Loại cổng
  • Bindings
  • dịch vụ

Một điều quan trọng cần lưu ý ở đây là định nghĩa về thông điệp, đó là những gì được truyền bởi Giao thức SOAP thực sự được định nghĩa trong tài liệu WSDL.

Tài liệu WSDL thực sự cho ứng dụng khách biết các loại thông báo SOAP được gửi và chấp nhận bởi dịch vụ Web.

Nói cách khác, WSDL giống như một tấm bưu thiếp có địa chỉ của một địa điểm cụ thể. Địa chỉ cung cấp thông tin chi tiết về người đã gửi bưu thiếp. Do đó, theo cách tương tự, tệp WSDL là bưu thiếp có địa chỉ của dịch vụ web có thể cung cấp tất cả các chức năng mà khách hàng muốn.

<!-- WSDL definition structure -->
<definitions     
		name="Guru99Service"
        targetNamespace=http://example.org/math/
        xmlns=http://schemas.xmlsoap.org/wsdl/>   
	<!-- abstract definitions -->   
		<types> ...    
			<message> ...   
			<portType> ...

   <!-- concrete definitions -->  
		<binding> ...   
		<service> ...
</definition>

Dưới đây là sơ đồ cấu trúc của một file WSDL

Cấu trúc của tài liệu WSDL
Cấu trúc của WSDL

Các phần tử WSDL

Tệp WSDL chứa các phần chính sau

  1. Thẻ được sử dụng để định nghĩa tất cả các kiểu dữ liệu phức tạp, sẽ được sử dụng trong thông điệp được trao đổi giữa ứng dụng máy khách và dịch vụ web. Đây là một khía cạnh quan trọng của ứng dụng máy khách, vì nếu dịch vụ web hoạt động với kiểu dữ liệu phức tạp, thì ứng dụng máy khách phải biết cách xử lý kiểu dữ liệu phức tạp đó. Các kiểu dữ liệu như float, số và chuỗi đều là các kiểu dữ liệu đơn giản, nhưng có thể có các kiểu dữ liệu có cấu trúc mà dịch vụ web có thể cung cấp.
    Ví dụ, có thể có một kiểu dữ liệu được gọi là EmployeeDataType có thể có 2 phần tử được gọi là “EmployeeName” thuộc kiểu chuỗi và “EmployeeID” thuộc kiểu số hoặc số nguyên. Cùng nhau chúng tạo thành một cấu trúc dữ liệu sau đó trở thành một kiểu dữ liệu phức tạp.
  2. thẻ được sử dụng để xác định thông báo được trao đổi giữa ứng dụng khách và máy chủ web. Những thông báo này sẽ giải thích các hoạt động đầu vào và đầu ra mà dịch vụ web có thể thực hiện. Ví dụ về tin nhắn có thể là tin nhắn chấp nhận ID nhân viên của nhân viên và tin nhắn đầu ra có thể là tên của nhân viên dựa trên EmpoyeeID được cung cấp.
  3. thẻ được sử dụng để gói gọn mọi thông báo đầu vào và đầu ra thành một thao tác logic. Vì vậy, có thể có một thao tác được gọi là “GetEmployee” kết hợp thông báo đầu vào về việc chấp nhận ID nhân viên từ ứng dụng khách và sau đó gửi Tên nhân viên làm thông báo đầu ra.
  4. thẻ được sử dụng để liên kết hoạt động với loại cổng cụ thể. Điều này là để khi ứng dụng khách gọi loại cổng liên quan, nó sẽ có thể truy cập các hoạt động được liên kết với loại cổng này. Các loại cổng cũng giống như giao diện. Vì vậy, nếu ứng dụng khách cần sử dụng dịch vụ web, chúng cần sử dụng thông tin ràng buộc để đảm bảo rằng chúng có thể kết nối với giao diện do dịch vụ web đó cung cấp.
  5. tag là tên được đặt cho chính dịch vụ web. Ban đầu, khi một ứng dụng khách thực hiện lệnh gọi đến dịch vụ web, nó sẽ thực hiện bằng cách gọi tên của dịch vụ web. Ví dụ: một dịch vụ web có thể được đặt tại một địa chỉ như http://localhost/Guru99/Tutorial.asmx . Thẻ dịch vụ thực sự sẽ có URL được xác định là http://localhost/Guru99/Tutorial.asmx, điều này thực sự sẽ cho ứng dụng khách biết rằng có sẵn một dịch vụ web tại vị trí này.

Tại sao WSDL

Dịch vụ web là một thành phần quan trọng trong việc xây dựng các ứng dụng web hiện đại. Mục đích chính của chúng là cho phép nhiều ứ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 với nhau. Ví dụ: chúng ta có thể yêu cầu một ứng dụng web .Net nói chuyện với một Java ứng dụng thông qua dịch vụ Web.

Một dịch vụ web có các tính năng chính sau

  • Nó được xây dựng bằng ngôn ngữ lập trình XML. Hầu hết tất cả các công nghệ hiện đại như .Net và Java có các lệnh tương ứng có khả năng làm việc với XML. Do đó, XML được coi là ngôn ngữ thích hợp nhất để xây dựng các dịch vụ web.
  • Các dịch vụ web giao tiếp qua HTTP. HTTP là giao thức được sử dụng bởi tất cả các ứng dụng dựa trên web. Do đó, việc đảm bảo rằng các dịch vụ Web cũng có khả năng hoạt động qua giao thức HTTP là điều hợp lý.
  • Các dịch vụ web tuân theo một đặc tả ngôn ngữ cụ thể. Thông số kỹ thuật này được thiết lập bởi W3C, cơ quan quản lý tất cả các tiêu chuẩn web.
  • Các dịch vụ web có ngôn ngữ mô tả được gọi là WSDL, được sử dụng để mô tả dịch vụ web.

Tệp WSDL được viết bằng XML cũ. Lý do nó ở dạng XML là để bất kỳ ngôn ngữ lập trình nào cũng có thể đọc được tệp.

Vì vậy, nếu ứng dụng khách được viết bằng .Net, nó sẽ hiểu tệp XML. Tương tự, nếu ứng dụng khách được viết bằng Java ngôn ngữ lập trình thì nó cũng có thể diễn giải tệp WSDL.

Cần WSDL

Tệp WSDL là thứ liên kết mọi thứ lại với nhau. Từ sơ đồ trên, bạn có thể thấy rằng bạn có thể tạo một dịch vụ web bằng ngôn ngữ .Net.

Vì vậy, đây là nơi dịch vụ được triển khai. Nếu bạn không có tệp WSDL và muốn có một Java class để sử dụng dịch vụ web, bạn sẽ cần rất nhiều nỗ lực viết mã để đạt được điều này.

Nhưng giờ đây với tệp WSDL ở định dạng XML, có thể được hiểu bởi bất kỳ ngôn ngữ lập trình nào, giờ đây bạn có thể dễ dàng có một Java lớp sử dụng dịch vụ web .Net. Do đó, số lượng nỗ lực mã hóa giảm đi rất nhiều.

Phần thông báo WSDL

WSDL bao gồm một phần được gọi là “thông báo” được biểu thị bằng thành phần.

Phần tử này về cơ bản được sử dụng để mô tả dữ liệu được trao đổi giữa dịch vụ web và ứng dụng khách.

Mỗi dịch vụ web sẽ luôn có 2 loại tin nhắn,

  • Một cái dành cho đầu vào của dịch vụ web và cái còn lại dành cho đầu ra của dịch vụ web.
  • Đầu vào được sử dụng để mô tả các tham số được dịch vụ web chấp nhận. Đây là một khía cạnh quan trọng của ứng dụng khách để nó biết các giá trị được gửi dưới dạng tham số cho dịch vụ web.
  • Loại thông báo khác là thông báo đầu ra cho biết dịch vụ web cung cấp kết quả gì.

Lần lượt, mỗi tin nhắn sẽ có một phần tử được sử dụng để mô tả tham số được sử dụng bởi thông báo đầu vào và đầu ra.

Dưới đây là một ví dụ đơn giản về thông báo cho một dịch vụ web trông như thế nào. Chức năng của dịch vụ web là cung cấp tên của “Hướng dẫn” sau khi “ID hướng dẫn” được gửi dưới dạng tham số cho dịch vụ web.

Phần thông báo WSDL

  1. Như chúng ta có thể thấy dịch vụ web có 2 tin nhắn, một cho đầu vào và một cho đầu ra.
  2. Thông báo đầu vào được gọi là TutorialNameRequest có một tham số gọi là TutorialID. Tham số này thuộc loại number được chỉ định bởi loại xsd:number
  3. Thông báo đầu ra được gọi là TutorialNameResponse có một tham số được gọi là TutorialName. Tham số này thuộc loại chuỗi được chỉ định bởi loại xsd:string

Ràng buộc loại cổng

Các cổng được sử dụng trong WSDL để xác định một hoạt động hoàn chỉnh được cung cấp bởi dịch vụ web.

Trong chủ đề trước, chúng ta đã thấy rằng dịch vụ web của chúng ta đã cung cấp 2 thông báo, một thông báo cho đầu vào có tên “TutorialNameRequest” và thông báo còn lại cho đầu ra có tên “TutorialNameResponse”. Cùng với nhau, dạng thông báo đầu vào và đầu ra được gọi là một thao tác hoàn chỉnh.

WSDL cung cấp một phần tử được gọi là được sử dụng để xác định các hoạt động được cung cấp bởi dịch vụ Web.

Ràng buộc loại cổng

Vì vậy, trong ví dụ trên, chúng ta có thể lưu ý những điều sau:

  1. Tên của Loại cổng đóng gói hoạt động được đặt là “Tutorial_PortType”.
  2. Bản thân hoạt động này được đặt tên là “Hướng dẫn”. Vì vậy, về cơ bản, hoạt động của chúng tôi sẽ cung cấp TutorialName nếu TutorialID được cung cấp làm tham số đầu vào.
  3. Tiếp theo là 2 thông báo của chúng ta, một cho đầu vào và một cho đầu ra hình thành nên hoạt động của chúng ta

Ngoài các phần tử, ngoài ra còn có phần tử được sử dụng để xác định cách truyền tin nhắn.

Ràng buộc loại cổng

  1. Ví dụ trên cho thấy ràng buộc bao gồm một tên ràng buộc mà trong trường hợp của chúng ta được đặt là “TutorialSoapBinding”. Ràng buộc theo thuật ngữ đơn giản là thông tin mà ứng dụng khách sử dụng để thực sự liên kết chính nó với dịch vụ web. Khi nó thực sự được liên kết với dịch vụ web, nó sẽ có khả năng gọi các hoạt động khác nhau được dịch vụ web hiển thị.
  2. Lớp vận chuyển được cung cấp dưới dạng http:// có nghĩa là các tin nhắn sẽ truyền qua giao thức HTTP.

Tạo tệp WSDL

Tệp WSDL được tạo bất cứ khi nào dịch vụ web được xây dựng bằng bất kỳ ngôn ngữ lập trình nào.

Vì tệp WSDL khá phức tạp để tạo từ đầu, tất cả các trình soạn thảo như Visual Studio cho .Net và Eclipse cho Java tự động tạo tệp WSDL.

Dưới đây là ví dụ về tệp WSDL được tạo trong Visual Studio.

<?xml version="1.0"?>
<definitions name="Tutorial"             
		targetNamespace=http://Guru99.com/Tutorial.wsdl           
        xmlns:tns=http://Guru99.com/Tutorial.wsdl            
        xmlns:xsd1=http://Guru99.com/Tutorial.xsd           
        xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/
        xmlns="http://schemas.xmlsoap.org/wsdl/"> 
   <types>    
   		<schema targetNamespace=http://Guru99.com/Tutorial.xsd    
        xmlns="http://www.w3.org/2000/10/XMLSchema">
        
        <element name="TutorialNameRequest">       
        	<complexType>         
            	<all>            
                	<element name="TutorialName" type="string"/>        
                </all>      
            </complexType>     
       </element>    
       <element name="TutorialIDRequest">       
       		<complexType>           
            	<all>           
                	<element name="TutorialID" type="number"/>         
                </all>      
            </complexType>     
       </element>    
    </schema>
 </types>  
 <message name="GetTutorialNameInput">   
 	<part name="body" element="xsd1:TutorialIDRequest"/>  
 </message> 
 <message name="GetTutorialNameOutput">  
 	<part name="body" element="xsd1:TutorialNameRequest"/>
 </message> 
 <portType name="TutorialPortType">  
 	<operation name="GetTutorialName">    
    	<input message="tns:GetTutorialNameInput"/>     
        <output message="tns:GetTutorialNameOutput"/>   
    </operation>  
  </portType> 
  <binding name="TutorialSoapBinding" type="tns:TutorialPortType">  
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>  
 	 <operation name="GetTutorialName">    
  		<soap:operation soapAction="http://Guru99.com/GetTutorialName"/>   
        	<input>   
            	<soap:body use="literal"/>   
            </input>  
        <output>      
   <soap:body use="literal"/>   
 </output>   
 </operation>  
 </binding>  
 
 <service name="TutorialService">   
 	<documentation>TutorialService</documentation>  
    <port name="TutorialPort" binding="tns:TutorialSoapBinding">     
    	<soap:address location="http://Guru99.com/Tutorial"/>
    </port>
 </service>
</definitions>

Tệp WSDL ở trên trông rất đáng sợ đối với bất kỳ người dùng nào, chúng tôi sẽ trình bày chi tiết các phần khác nhau trong các hướng dẫn tiếp theo, nhưng bây giờ, chúng ta hãy xem tóm tắt chức năng thực sự của từng phần của tệp WSDL

Xuất bản ví dụ về dịch vụ web

Bây giờ chúng ta hãy xem một ví dụ về cách chúng ta có thể xuất bản một dịch vụ web và sử dụng nó bằng cách sử dụng Visual Studio.

Trong ví dụ này, chúng tôi sẽ tạo một dịch vụ web với một WebMethod. Phương thức này sẽ chấp nhận một tham số Số nguyên có tên là “TutorialID”. Phương thức Web sau đó sẽ trả về một chuỗi có tên là “Dịch vụ Web”.

Sau đó, chúng tôi sẽ tạo một ứng dụng dựa trên bảng điều khiển, ứng dụng này sẽ sử dụng dịch vụ web này và gọi phương thức web của chúng tôi cho phù hợp.

Hãy xem xét các bước cần thiết để thực hiện ví dụ này.

Bước 1) Bước đầu tiên là tạo dịch vụ web của bạn. Các bước chi tiết về cách thực hiện Asp.Net dự án web và một dịch vụ web được tạo ra đã được giải thích đây; Hãy làm theo các bước tương tự để tạo dự án và dịch vụ web phù hợp. Phần quan trọng là nhập mã bên dưới vào tệp dịch vụ Web.

Xuất bản ví dụ về dịch vụ web

namespace webservic asmx
{
	[WebService(Name = "Guru99 Web service")]
	public class TutorialService : System.Web.Services.WebService
	{
		[WebMethod]
		public string GetTutorialService(int TutoriallD)
		{
			string TutorialName = "Web Services";
			return TutorialName;
		}
	}
}

Giải thích mã:

  1. Ở đây chúng tôi đang tạo một WebMethod có tên là “Guru99WebService”. Trong phương thức web này, chúng tôi đang bao gồm một tham số số nguyên cần được truyền bất cứ khi nào phương thức web này được gọi.
  2. Tiếp theo, chúng ta xác định một biến có tên “TutorialName” sẽ chứa giá trị chuỗi của “Dịch vụ web”. Đây là giá trị sẽ được trả về khi dịch vụ web được gọi.

Bước 2) Khi chúng tôi đã xác định tệp dịch vụ web, bước tiếp theo là tạo một dự án khách sẽ sử dụng dịch vụ web này.

Hãy tạo một ứng dụng bảng điều khiển đơn giản sẽ gọi dịch vụ web này, gọi “Guru99WebService” rồi hiển thị đầu ra của phương thức web trong màn hình nhật ký bảng điều khiển. Thực hiện theo các bước dưới đây để tạo một ứng dụng bảng điều khiển.

Nhấp chuột phải vào tệp giải pháp Visual Studio và chọn tùy chọn Thêm->Dự án mới

Xuất bản ví dụ về dịch vụ web

Bước 3) Trong bước này,

  1. Đảm bảo trước tiên chọn Visual C# Windows lựa chọn. Sau đó chọn tùy chọn tạo ứng dụng bảng điều khiển.
  2. Đặt tên cho dự án của bạn, trong trường hợp của chúng tôi được đặt là “DemoApplication”.

Xuất bản ví dụ về dịch vụ web

Sau khi bạn nhấp vào nút OK ở màn hình trên, bạn sẽ có thể thấy dự án trong Solution explorer của Visual Studio.

Xuất bản ví dụ về dịch vụ web

Bước 4) Trong bước này, bạn sẽ thiết lập ứng dụng DemoApplication Console làm dự án khởi động. Điều này được thực hiện để đảm bảo rằng ứng dụng này khởi chạy đầu tiên khi toàn bộ dự án Visual Studio được chạy. Ứng dụng Console này sẽ lần lượt gọi dịch vụ web sẽ được Visual Studio tự động khởi chạy.

Để hoàn thành bước này, nhấp chuột phải vào dự án DemoApplication và chọn tùy chọn “Đặt làm dự án khởi động”.

Xuất bản ví dụ về dịch vụ web

Bước 5) Bước tiếp theo là thêm tham chiếu dịch vụ của “Guru99Webservice” vào ứng dụng bảng điều khiển của chúng tôi. Điều này được thực hiện để DemoApplication có thể tham chiếu dịch vụ web và tất cả các phương thức web trong dịch vụ web.

Để thực hiện việc này, nhấp chuột phải vào tệp dự án DemoApplication và chọn tùy chọn menu Thêm->Tham khảo dịch vụ.

Xuất bản ví dụ về dịch vụ web

Bước 6) Trong bước này, chúng tôi sẽ cung cấp các giá trị khác nhau được yêu cầu để thêm tham chiếu dịch vụ của chúng tôi

  1. Đầu tiên chúng ta cần chọn tùy chọn khám phá của mình. Tùy chọn này sẽ tự động nhận tệp WSDL cho dịch vụ web TutorialService của chúng tôi.
  2. Tiếp theo, chúng ta nên đặt tên cho dịch vụ tham khảo của mình. Trong trường hợp của chúng tôi, chúng tôi đặt tên cho nó là Guru99Webservice.
  3. Sau đó, chúng ta cần mở rộng tùy chọn TutorialService.asmx để có thể thấy phương thức 'GetTutorialService' ở phía bên phải. Ở đây, TutorialService.asmx là tên tệp Visual Studio .Net của chúng ta, tệp này chứa mã cho dịch vụ web của chúng ta.
  4. Sau đó, chúng ta sẽ thấy phương thức Web mà chúng ta có trong dịch vụ web của mình có tên là “GetTutorialService”

Xuất bản ví dụ về dịch vụ web

Khi chúng tôi nhấp vào nút 'OK', tất cả mã được yêu cầu để truy cập dịch vụ web này sẽ được thêm vào ứng dụng DemoApplication Console của chúng tôi như hiển thị bên dưới.

Ảnh chụp màn hình cho thấy “Guru99Webservice” đã được thêm thành công vào ứng dụng bảng điều khiển của chúng tôi.

Xuất bản ví dụ về dịch vụ web

Bước 7) Bước tiếp theo là thêm mã vào ứng dụng bảng điều khiển để truy cập phương thức web trong dịch vụ web của chúng tôi. Mở tệp mã Program.cs tự động đi kèm với ứng dụng bảng điều khiển và thêm mã bên dưới

Xuất bản ví dụ về dịch vụ web

namespace DemoApplication
{
	class Program
	{
		static void Main(string[ ] args)
		{
			var client = new Guru99Webservice.Guru99WebserviceSoapClient();

			Console.WriteLine(client.GetTutorialService(l));
			
			Console.ReadKey();
		}
	}
}

Giải thích mã: -

  1. Phần đầu tiên là chọn tệp Program.cs. Đây là tệp chính được Visual Studio tạo ra khi ứng dụng console được tạo. Tệp này là tệp được thực thi khi ứng dụng console (trong trường hợp của chúng tôi là ứng dụng demo) được thực thi.
  2. Sau đó, chúng tôi tạo một biến có tên là “client”, biến này sẽ được đặt thành một phiên bản tham chiếu Dịch vụ của chúng tôi đã được tạo ở bước trước đó. Trong trường hợp của chúng tôi, tham chiếu dịch vụ là 'Guru99Webservice.Guru99WebserviveSoapClient()'
  3. Sau đó, chúng tôi gọi Phương thức web của mình là 'GetTutorialService' trong dịch vụ web TutorialService. Hãy nhớ rằng phương thức GetTutorialService' của chúng tôi chấp nhận một tham số số nguyên, vì vậy chúng tôi chỉ truyền một tham số số nguyên cho phương thức web.
  4. Dòng cuối cùng này chỉ nhằm đảm bảo màn hình nhật ký bảng điều khiển vẫn hoạt động để chúng ta có thể xem đầu ra. Lệnh này sẽ chỉ đợi một số đầu vào từ người dùng.

Đầu ra

Khi tất cả các bước trên được thực hiện và DemoApplication được chạy, kết quả bên dưới sẽ được hiển thị.

Xuất bản ví dụ về dịch vụ web

Từ đầu ra, chúng ta có thể thấy rõ rằng DemoApplication gọi dịch vụ Web của chúng ta và chuỗi được dịch vụ Web trả về được hiển thị trong nhật ký Console của chúng ta.

Tổng kết

  • Dạng đầy đủ của WSDL là Dịch vụ Web Descriptngôn ngữ ion
  • Tài liệu WSDL là tài liệu được sử dụng để mô tả một dịch vụ web. Đây là chìa khóa để mọi ứng dụng khách biết vị trí của dịch vụ web. Nó cũng cho phép ứng dụng khách hiểu các phương thức có sẵn trong dịch vụ web.
  • Tệp WSDL giúp dịch vụ web được triển khai rất dễ dàng bằng một ngôn ngữ lập trình và được gọi từ một ngôn ngữ lập trình khác.
  • Tài liệu WSDL thường bao gồm một thông báo. Đối với mỗi phương thức web, có 2 thông báo, một dành cho đầu vào và một dành cho đầu ra. Họ cùng nhau tạo thành một hoạt động.
  • Dịch vụ website DescriptCác tệp Ngôn ngữ ion (viết tắt của WSDL) thường được tạo trong trình chỉnh sửa được sử dụng cho ngôn ngữ lập trình tương ứng.
  • Chúng ta đã thấy cách chúng ta có thể sử dụng một dịch vụ web trong Visual Studio. Điều này có thể được thực hiện bằng cách tạo một dự án khác là một ứng dụng bảng điều khiển. Sau đó, bằng cách thêm một tham chiếu dịch vụ, chúng ta có thể truy cập các phương thức web trong dịch vụ web của mình.