XML-RPC - Hướng dẫn nhanh

RPC là viết tắt của Từ xa Thủ tục Gọi. Như tên gọi của nó, nó là một cơ chế để gọi một thủ tục hoặc một hàm có sẵn trên một máy tính từ xa. RPC là một công nghệ cũ hơn nhiều so với Web. Một cách hiệu quả, RPC cung cấp cho các nhà phát triển một cơ chế để xác định các giao diện có thể được gọi qua mạng. Các giao diện này có thể đơn giản như một lệnh gọi hàm đơn lẻ hoặc phức tạp như một API lớn.

XML-RPC là gì?

XML-RPC là một trong những cách tiếp cận dịch vụ web đơn giản nhất và dễ đánh lừa nhất giúp máy tính dễ dàng gọi các thủ tục trên máy tính khác.

  • XML-RPC cho phép các chương trình thực hiện các lệnh gọi hàm hoặc thủ tục trên mạng.

  • XML-RPC sử dụng giao thức HTTP để truyền thông tin từ máy khách đến máy chủ.

  • XML-RPC sử dụng một từ vựng XML nhỏ để mô tả bản chất của các yêu cầu và phản hồi.

  • Máy khách XML-RPC chỉ định tên thủ tục và các tham số trong yêu cầu XML và máy chủ trả về lỗi hoặc phản hồi trong phản hồi XML.

  • Các tham số XML-RPC là một danh sách các kiểu và nội dung đơn giản - cấu trúc và mảng là những kiểu phức tạp nhất hiện có.

  • XML-RPC không có khái niệm về các đối tượng và không có cơ chế bao gồm thông tin sử dụng các từ vựng XML khác.

  • Tuy nhiên, với XML-RPC và các dịch vụ web, Web trở thành một tập hợp các kết nối thủ tục, nơi các máy tính trao đổi thông tin theo các đường dẫn ràng buộc chặt chẽ.

  • XML-RPC xuất hiện vào đầu năm 1998; nó được xuất bản bởi UserLand Software và ban đầu được triển khai trong sản phẩm Frontier của họ.

Tại sao lại sử dụng XML-RPC?

Nếu bạn cần tích hợp nhiều môi trường máy tính, nhưng không cần chia sẻ trực tiếp các cấu trúc dữ liệu phức tạp, bạn sẽ thấy rằng XML-RPC cho phép bạn thiết lập liên lạc nhanh chóng và dễ dàng.

Ngay cả khi bạn làm việc trong một môi trường duy nhất, bạn có thể thấy rằng cách tiếp cận RPC giúp dễ dàng kết nối các chương trình có các mô hình dữ liệu hoặc kỳ vọng xử lý khác nhau và nó có thể cung cấp khả năng truy cập dễ dàng vào logic có thể sử dụng lại.

  • XML-RPC là một công cụ tuyệt vời để thiết lập nhiều loại kết nối giữa các máy tính.

  • XML-RPC cung cấp cho các nhà tích hợp cơ hội sử dụng từ vựng và cách tiếp cận tiêu chuẩn để trao đổi thông tin.

  • Lĩnh vực ứng dụng rõ ràng nhất của XML-RPC là kết nối các loại môi trường khác nhau, cho phép Java nói chuyện với Perl, Python, ASP, v.v.

Tổng quan về kỹ thuật XML-RPC

XML-RPC bao gồm ba phần tương đối nhỏ:

  • XML-RPC data model : Một tập hợp các kiểu để sử dụng trong việc truyền tham số, giá trị trả về và lỗi (thông báo lỗi).

  • XML-RPC request structures : Một yêu cầu HTTP POST chứa thông tin về phương thức và thông số.

  • XML-RPC response structures : Một phản hồi HTTP có chứa các giá trị trả về hoặc thông tin lỗi.

Chúng ta sẽ nghiên cứu cả ba thành phần này trong ba chương tiếp theo.

Đặc tả XML-RPC xác định sáu kiểu dữ liệu cơ bản và hai kiểu dữ liệu kết hợp biểu thị sự kết hợp của các kiểu.

Các kiểu dữ liệu cơ bản trong XML-RPC

Kiểu Giá trị Ví dụ
int hoặc i4 Các số nguyên 32 bit giữa - 2.147.483.648 và 2.147.483.647.

<int> 27 </int>

<i4> 27 </i4>

gấp đôi Số dấu phẩy động 64 bit

<double> 27.31415 </double>

<double> -1.1465 </double>

Boolean true (1) hoặc false (0)

<boolean> 1 </boolean>

<boolean> 0 </boolean>

chuỗi Văn bản ASCII, mặc dù nhiều triển khai hỗ trợ Unicode

<string> Xin chào </string>

<string> bonkers! @ </string>

dateTime.iso8601 Ngày ở định dạng ISO8601: CCYYMMDDTHH: MM: SS

<dateTime.iso8601>

20021125T02: 20: 04

</dateTime.iso8601>

<dateTime.iso8601>

20020104T17: 27: 30

</dateTime.iso8601>

base64 Thông tin nhị phân được mã hóa dưới dạng Cơ sở 64, như được định nghĩa trong RFC 2045

<base64> SGVsbG8sIFdvcmxkIQ == </base64>

Các kiểu cơ bản này luôn được bao bọc trong các phần tử giá trị . Chuỗi (và chỉ chuỗi) có thể được bao trong một phần tử giá trị nhưng bỏ qua phần tử chuỗi . Những kiểu cơ bản này có thể được kết hợp thành hai kiểu phức tạp hơn, mảng và cấu trúc. Mảng đại diện cho thông tin tuần tự, trong khi cấu trúc đại diện cho các cặp tên-giá trị, giống như các dấu thăng, mảng kết hợp hoặc thuộc tính.

Mảng được biểu thị bởi phần tử mảng , phần tử này chứa một phần tử dữ liệu chứa danh sách các giá trị. Giống như các kiểu dữ liệu khác, phần tử mảng phải được bao trong một phần tử giá trị . Ví dụ, mảng sau chứa bốn chuỗi:

<value>
   <array>
      <data>
         <value><string>This </string></value>
         <value><string>is </string></value>
         <value><string>an </string></value>
         <value><string>array.</string></value>
      </data>
   </array>
</value>

Mảng sau chứa bốn số nguyên:

<value>
   <array>
      <data>
         <value><int>7</int></value>
         <value><int>1247</int></value>
         <value><int>-91</int></value>
         <value><int>42</int></value>
      </data>
   </array>
</value>

Mảng cũng có thể chứa hỗn hợp các loại khác nhau, như được hiển thị ở đây:

<value>
   <array>
      <data>
         <value><boolean>1</boolean></value>
         <value><string>Chaotic collection, eh?</string></value>
         <value><int>-91</int></value>
         <value><double>42.14159265</double></value>
      </data>
   </array>
</value>

Tạo mảng nhiều chiều rất đơn giản - chỉ cần thêm một mảng bên trong một mảng:

<value>
   <array>
      <data>
		
         <value>
            <array>
               <data>
                  <value><int>10</int></value>
                  <value><int>20</int></value>
                  <value><int>30</int></value>
               </data>
            </array>
         </value>
			
         <value>
            <array>
               <data>
                  <value><int>15</int></value>
                  <value><int>25</int></value>
                  <value><int>35</int></value>
               </data>
            </array>
         </value>
			
      </data>
   </array>
</value>

Một cấu trúc đơn giản có thể giống như sau:

<value>
   <struct>
      <member>
         <name>givenName</name>
         <value><string>Joseph</string></value>
      </member>
		
      <member>
         <name>familyName</name>
         <value><string>DiNardo</string></value>
      </member>
		
      <member>
         <name>age</name>
         <value><int>27</int></value>
      </member>
   </struct>
</value>

Bằng cách này, bạn có thể triển khai hầu hết các kiểu dữ liệu được hỗ trợ bởi bất kỳ ngôn ngữ lập trình nào.

Yêu cầu XML-RPC là sự kết hợp của nội dung XML và tiêu đề HTTP. Nội dung XML sử dụng cấu trúc nhập dữ liệu để chuyển các tham số và chứa thông tin bổ sung xác định thủ tục nào đang được gọi, trong khi tiêu đề HTTP cung cấp một trình bao bọc để chuyển yêu cầu qua Web.

Mỗi yêu cầu chứa một tài liệu XML duy nhất, có phần tử gốc là phần tử methodCall . Mỗi phần tử methodCall chứa một phần tử methodName và một phần tử params . Phần tử methodName xác định tên của thủ tục được gọi, trong khi phần tử params chứa danh sách các tham số và giá trị của chúng. Mỗi params yếu tố bao gồm một danh sách các yếu tố param mà lần lượt chứa giá trị các yếu tố.

Ví dụ: để chuyển một yêu cầu đến một phương thức gọi là circleArea , phương thức này nhận tham số Double (cho bán kính), yêu cầu XML-RPC sẽ giống như sau:

<?xml version="1.0"?>
<methodCall>
   <methodName>circleArea</methodName>
      <params>
         <param>
            <value><double>2.41</double></value>
         </param>
      </params>
</methodCall>

Tiêu đề HTTP cho các yêu cầu này sẽ phản ánh người gửi và nội dung. Mẫu cơ bản trông như sau:

POST /target HTTP 1.0
User-Agent: Identifier
Host: host.making.request
Content-Type: text/xml
Content-Length: length of request in bytes

Ví dụ: nếu phương thức circleArea có sẵn từ máy chủ XML-RPC đang lắng nghe tại / xmlrpc , thì yêu cầu có thể giống như sau:

POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169

Được lắp ráp, toàn bộ yêu cầu sẽ giống như sau:

POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
<?xml version="1.0"?>
<methodCall>
   <methodName>circleArea</methodName>
      <params>
         <param>
            <value><double>2.41</double></value>
         </param>
      </params>
</methodCall>

Đó là một yêu cầu HTTP thông thường, với trọng tải được xây dựng cẩn thận.

Các câu trả lời giống như các yêu cầu, với một vài điểm bổ sung. Nếu phản hồi thành công - thủ tục được tìm thấy, thực thi chính xác và trả về kết quả - thì phản hồi XML-RPC sẽ trông giống như một yêu cầu, ngoại trừ phần tử methodCall được thay thế bằng phần tử methodResponse và không có phần tử methodName :

<?xml version="1.0"?>
<methodResponse>
   <params>
      <param>
         <value><double>18.24668429131</double></value>
      </param>
   </params>
</methodResponse>
  • Một phản hồi XML-RPC chỉ có thể chứa một tham số.

  • Tham số đó có thể là một mảng hoặc một cấu trúc, vì vậy có thể trả về nhiều giá trị.

  • Nó luôn được yêu cầu trả về một giá trị để phản hồi. Một "giá trị thành công" - có lẽ là một Boolean được đặt thành true (1).

Giống như yêu cầu, phản hồi được đóng gói trong HTTP và có tiêu đề HTTP. Tất cả các phản hồi XML-RPC sử dụng mã phản hồi 200 OK, ngay cả khi có lỗi trong thư. Tiêu đề sử dụng cấu trúc chung tương tự như cấu trúc của yêu cầu và một tập hợp tiêu đề điển hình có thể trông giống như:

HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
  • XML-RPC chỉ yêu cầu hỗ trợ HTTP 1.0, nhưng HTTP 1.1 thì tương thích.

  • Loại-Nội dung phải được đặt thành văn bản / xml.

  • Tiêu đề Nội dung-Độ dài chỉ định độ dài của phản hồi tính bằng byte.

Một phản hồi hoàn chỉnh, có cả tiêu đề và trọng tải phản hồi, sẽ giống như sau:

HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124

<?xml version="1.0"?>
<methodResponse>
   <params>
      <param>
         <value><double>18.24668429131</double></value>
      </param>
   </params>
</methodResponse>

Sau khi phản hồi được gửi từ máy chủ XML-RPC đến máy khách XML-RPC, kết nối sẽ bị đóng. Các yêu cầu tiếp theo cần được gửi dưới dạng các kết nối XML-RPC riêng biệt.

Lỗi XML-RPC là một loại phản hồi. Nếu có sự cố khi xử lý yêu cầu XML-RPC, phần tử methodResponse sẽ chứa phần tử lỗi thay vì phần tử params. Phần tử lỗi, giống như phần tử params , chỉ có một giá trị duy nhất cho biết đã xảy ra sự cố. Phản hồi lỗi có thể giống như sau:

<?xml version="1.0"?>
<methodResponse>
   <fault>
      <value><string>No such method!</string></value>
   </fault>
</methodResponse>

Một lỗi cũng sẽ có một mã lỗi. XML-RPC hoàn toàn không chuẩn hóa mã lỗi. Bạn sẽ cần kiểm tra tài liệu cho các gói cụ thể để xem cách chúng xử lý lỗi.

Phản hồi lỗi cũng có thể giống như sau:

<?xml version="1.0"?>
<methodResponse>
   <fault>
      <value>
         <struct>
            <member>
               <name>code</name>
               <value><int>26</int></value>
            </member>
				
            <member>
               <name>message</name>
               <value><string>No such method!</string></value>
            </member>
				
         </struct>
      </value>
   </fault>
</methodResponse>

Để chứng minh XML-RPC, chúng tôi sẽ tạo một máy chủ sử dụng Java để xử lý các thông báo XML-RPC và chúng tôi sẽ tạo một máy khách Java để gọi các thủ tục trên máy chủ đó.

Phía Java của cuộc hội thoại sử dụng Apache XML-RPC của Dự án XML Apache, có sẵn tại http://xml.apache.org/xmlrpc/

Đặt tất cả các tệp .jar vào đường dẫn thích hợp và để chúng tôi tạo một máy khách và một máy chủ XML-RPC nhỏ bằng JAVA.

Ứng dụng khách XML-RPC

Hãy để chúng tôi viết một máy khách XML-RPC để gọi một hàm được gọi là hàm sum . Hàm này nhận hai tham số và trả về tổng của chúng.

import java.util.*;
import org.apache.xmlrpc.*;

public class JavaClient 
{
   public static void main (String [] args) 
   {
      try {

         XmlRpcClient client = new XmlRpcClient("http://localhost/RPC2"); 
         Vector params = new Vector();
         params.addElement(new Integer(17));
         params.addElement(new Integer(13));

         Object result = server.execute("sample.sum", params);

         int sum = ((Integer) result).intValue();
         System.out.println("The sum is: "+ sum);

      } catch (Exception exception) {
         System.err.println("JavaClient: " + exception);
      }
   }
}

Hãy để chúng tôi xem những gì đã xảy ra trong ứng dụng ví dụ trên.

  • Gói Java org.apache.xmlrpc chứa các lớp dành cho máy khách Java XML-RPC và máy chủ XML-RPC, ví dụ: XmlRpcClient.

  • Gói java.util là cần thiết cho lớp Vector.

  • Hàm server.execute (...) gửi yêu cầu đến máy chủ. Tổng thủ tục (17,13) được gọi trên máy chủ như thể nó là một thủ tục cục bộ. Giá trị trả về của một lời gọi thủ tục luôn là một Đối tượng.

  • Ở đây "mẫu" biểu thị một trình xử lý được xác định trong máy chủ.

  • Lưu ý rằng tất cả các tham số của lệnh gọi thủ tục luôn được thu thập trong một Vector.

  • Lớp XmlRpcClient được xây dựng bằng cách chỉ định "địa chỉ web" của máy chủ theo sau là / RPC2.

    • localhost - có nghĩa là máy cục bộ

    • Bạn có thể chỉ định một số IP thay vì localhost, ví dụ: 194.80.215.219

    • Bạn có thể chỉ định một tên miền như xyz.dyndns.org

    • Bạn có thể chỉ định số cổng cùng với tên miền là xyz.dyndns.org:8080. Cổng mặc định là 80

  • Lưu ý rằng kết quả của lệnh gọi thủ tục từ xa luôn là một Đối tượng và nó phải được chuyển sang kiểu thích hợp.

  • Khi sự cố xảy ra (không có kết nối, v.v.), một Ngoại lệ được ném ra và nó phải được bắt bằng câu lệnh catch .

Do cuộc gọi trên, một máy khách sẽ gửi thông báo sau đến máy chủ. Lưu ý rằng điều này được xử lý bởi server.execute (...) trong nội bộ và bạn không phải làm gì với nó.

<?xml version="1.0" encoding="ISO-8859-1"?>
<methodCall>
   <methodName>sample.sum</methodName>
   <params>
      <param>
         <value><int>17</int></value>
      </param>
		 
      <param>
         <value><int>13</int></value>
      </param>
   </params>
</methodCall>

Máy chủ XML-RPC

Sau đây là mã nguồn của Máy chủ XML-RPC được viết bằng Java. Nó sử dụng các lớp tích hợp sẵn có trong org.apache.xmlrpc. *

import org.apache.xmlrpc.*;

public class JavaServer 
{ 

   public Integer sum(int x, int y) 
   {
      return new Integer(x+y);
   }

   public static void main (String [] args) 
   {
      try {

         System.out.println("Attempting to start XML-RPC Server...");
         WebServer server = new WebServer(80);
         server.addHandler("sample", new JavaServer());
         server.start();
         System.out.println("Started successfully.");
         System.out.println("Accepting requests. (Halt program to stop.)");
      } catch (Exception exception) 
      {
         System.err.println("JavaServer: " + exception);
      }
   }
}

Hãy để chúng tôi xem những gì chúng tôi đã làm trong máy chủ ví dụ trên.

  • Gói org.apache.xmlrpc chứa lớp WebServer để triển khai Máy chủ XML-RPC.

  • Các thủ tục tổng đó được gọi là điều khiển từ xa được thực hiện như một phương pháp nào trong một lớp học.

  • Một phiên bản của cùng một lớp máy chủ sau đó được liên kết với một trình xử lý mà máy khách có thể truy cập được.

  • Máy chủ được khởi tạo bởi số cổng (ở đây: 80).

  • Khi sự cố xảy ra, một Ngoại lệ được ném ra và phải được bắt bằng câu lệnh catch .

Đối với cuộc gọi được đề cập trong ứng dụng khách mẫu đã cho, máy chủ sẽ gửi phản hồi sau trở lại ứng dụng khách:

<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
   <params>
      <param>
         <value><int>30</int></value>
      </param>
   </params>
</methodResponse>

Bây giờ máy chủ của bạn đã sẵn sàng, vì vậy hãy biên dịch và chạy nó theo lời nhắc của bạn như sau:

C:\ora\xmlrpc\java>java JavaServer
Attempting to start XML-RPC Server...
Started successfully.
Accepting requests. (Halt program to stop.)

Bây giờ để kiểm tra chức năng, hãy gọi đến máy chủ này như sau:

C:\ora\xmlrpc\java>java JavaClient
30

Trong hướng dẫn này, bạn đã học được XML-RPC là gì và tại sao chúng ta cần XML-RPC. Chúng tôi đã thảo luận về mô hình dữ liệu của nó, cũng như định dạng thông báo yêu cầu và phản hồi được trao đổi giữa máy khách và máy chủ. Chúng tôi đã đưa ra một ví dụ để chứng minh cách máy khách và máy chủ XML-RPC hoạt động để trao đổi thông tin.

XML-RPC là một khái niệm rất đơn giản với một số khả năng hạn chế. Những hạn chế đó theo nhiều cách là tính năng hấp dẫn nhất của XML-RPC, vì chúng làm giảm đáng kể khó khăn trong việc triển khai giao thức và kiểm tra khả năng tương tác của nó.

Mặc dù XML-RPC đơn giản nhưng việc áp dụng sáng tạo các công cụ đơn giản có thể tạo ra các kiến ​​trúc tinh vi và mạnh mẽ. Trong trường hợp nhiều hệ thống khác nhau cần giao tiếp, XML-RPC có thể là mẫu số chung thấp nhất thích hợp nhất.

Cái gì tiếp theo?

Bước tiếp theo là tìm hiểu WSDL và SOAP.

WSDL

WSDL là một ngôn ngữ dựa trên XML để mô tả các dịch vụ Web và cách truy cập chúng.

WSDL mô tả một dịch vụ web, cùng với định dạng thông báo và chi tiết giao thức cho dịch vụ Web.

Nếu bạn muốn tìm hiểu thêm về WSDL, vui lòng xem qua hướng dẫn về WSDL của chúng tôi .

XÀ BÔNG TẮM

SOAP là một giao thức dựa trên XML đơn giản cho phép các ứng dụng trao đổi thông tin qua HTTP.

Nếu bạn muốn tìm hiểu thêm về SOAP, vui lòng xem qua hướng dẫn SOAP của chúng tôi .