Dịch vụ web với Ruby - SOAP4R

SOAP là gì?

Giao thức truy cập đối tượng đơn giản (SOAP), là một giao thức RPC đa nền tảng và độc lập với ngôn ngữ dựa trên XML và thường là (nhưng không nhất thiết) HTTP.

Nó sử dụng XML để mã hóa thông tin thực hiện cuộc gọi thủ tục từ xa và HTTP để vận chuyển thông tin đó qua mạng từ máy khách đến máy chủ và ngược lại.

SOAP có một số lợi thế so với các công nghệ khác như COM, CORBA, v.v.: ví dụ, chi phí triển khai và gỡ lỗi tương đối rẻ, khả năng mở rộng và dễ sử dụng, và sự tồn tại của một số triển khai cho các ngôn ngữ và nền tảng khác nhau.

Vui lòng tham khảo SOAP hướng dẫn đơn giản của chúng tôi để hiểu chi tiết.

Chương này giúp bạn làm quen với việc triển khai SOAP cho Ruby (SOAP4R). Đây là một hướng dẫn cơ bản, vì vậy nếu bạn cần chi tiết sâu hơn, bạn sẽ cần tham khảo các nguồn khác.

Cài đặt SOAP4R

SOAP4R là phần triển khai SOAP cho Ruby do Hiroshi Nakamura phát triển và có thể tải xuống từ -

NOTE - Có thể có nhiều khả năng là bạn đã cài đặt thành phần này.

Download SOAP

Nếu bạn biết về gem thì bạn có thể sử dụng lệnh sau để cài đặt SOAP4R và các gói liên quan.

$ gem install soap4r --include-dependencies

Nếu bạn đang làm việc trên Windows, thì bạn cần tải xuống tệp nén từ vị trí trên và cần cài đặt nó bằng phương pháp cài đặt tiêu chuẩn bằng cách chạy ruby install.rb .

Viết máy chủ SOAP4R

SOAP4R hỗ trợ hai loại máy chủ khác nhau -

  • Dựa trên CGI / FastCGI (SOAP :: RPC :: CGIStub)
  • Độc lập (SOAP :: RPC: StandaloneServer)

Chương này cung cấp chi tiết về cách viết một máy chủ độc lập. Các bước sau đây liên quan đến việc viết một máy chủ SOAP.

Bước 1 - Kế thừa SOAP :: RPC :: Lớp máy chủ độc lập

Để triển khai máy chủ độc lập của riêng bạn, bạn cần viết một lớp mới, lớp này sẽ là con của SOAP :: StandaloneServer như sau:

class MyServer < SOAP::RPC::StandaloneServer
  ...............
end

NOTE- Nếu bạn muốn viết một máy chủ dựa trên FastCGI thì bạn cần lấy SOAP :: RPC :: CGIStub làm lớp cha, phần còn lại của thủ tục sẽ giữ nguyên.

Bước 2 - Xác định phương thức xử lý

Bước thứ hai là viết các phương thức Dịch vụ Web của bạn mà bạn muốn đưa ra thế giới bên ngoài.

Chúng có thể được viết dưới dạng các phương thức Ruby đơn giản. Ví dụ, hãy viết hai phương pháp để cộng hai số và chia hai số -

class MyServer < SOAP::RPC::StandaloneServer
   ...............

   # Handler methods
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

Bước 3 - Phơi bày các phương pháp xử lý

Bước tiếp theo là thêm các phương thức đã xác định của chúng tôi vào máy chủ của chúng tôi. Các initialize phương pháp được sử dụng để tiếp xúc với các phương pháp dịch vụ với một trong hai phương pháp sau đây -

class MyServer < SOAP::RPC::StandaloneServer
   def initialize(*args)
      add_method(receiver, methodName, *paramArg)
   end
end

Đây là mô tả của các tham số -

Sr.No. Mô tả về Thông Số
1

receiver

Đối tượng chứa phương thức methodName. Bạn xác định các phương thức dịch vụ trong cùng một lớp với phương thức methodDef, tham số này là chính nó .

2

methodName

Tên của phương thức được gọi do một yêu cầu RPC.

3

paramArg

Chỉ định, khi đã cho, tên tham số và chế độ tham số.

Để hiểu cách sử dụng các tham số inout hoặc out , hãy xem xét phương thức dịch vụ sau đây nhận hai tham số (inParam và inoutParam), trả về một giá trị trả về bình thường (retVal) và hai tham số khác: inoutParamoutParam -

def aMeth(inParam, inoutParam)
   retVal = inParam + inoutParam
   outParam = inParam . inoutParam
   inoutParam = inParam * inoutParam
   return retVal, inoutParam, outParam
end

Bây giờ, chúng ta có thể trình bày phương pháp này như sau:

add_method(self, 'aMeth', [
   %w(in inParam),
   %w(inout inoutParam),
   %w(out outParam),
   %w(retval return)
])

Bước 4 - Khởi động máy chủ

Bước cuối cùng là khởi động máy chủ của bạn bằng cách khởi tạo một phiên bản của lớp dẫn xuất và gọi start phương pháp.

myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)

myServer.start

Đây là mô tả của các tham số bắt buộc -

Sr.No. Mô tả về Thông Số
1

ServerName

Tên máy chủ, bạn có thể đặt những gì bạn thích nhất.

2

urn:ruby:ServiceName

Ở đây urn: ruby là không đổi nhưng bạn có thể đặt tên ServiceName duy nhất cho máy chủ này.

3

hostname

Chỉ định tên máy chủ mà máy chủ này sẽ lắng nghe.

4

port

Số cổng khả dụng sẽ được sử dụng cho dịch vụ web.

Thí dụ

Bây giờ, bằng cách sử dụng các bước trên, chúng ta hãy viết một máy chủ độc lập -

require "soap/rpc/standaloneserver"

begin
   class MyServer < SOAP::RPC::StandaloneServer

      # Expose our services
      def initialize(*args)
         add_method(self, 'add', 'a', 'b')
         add_method(self, 'div', 'a', 'b')
      end

      # Handler methods
      def add(a, b)
         return a + b
      end
      def div(a, b) 
         return a / b 
      end
end
   server = MyServer.new("MyServer", 
            'urn:ruby:calculation', 'localhost', 8080)
   trap('INT){
      server.shutdown
   }
   server.start
rescue => err
   puts err.message
end

Khi được thực thi, ứng dụng máy chủ này khởi động một máy chủ SOAP độc lập trên localhost và lắng nghe các yêu cầu trên cổng 8080. Nó hiển thị một phương thức dịch vụ, thêmdiv , lấy hai tham số và trả về kết quả.

Bây giờ, bạn có thể chạy máy chủ này ở chế độ nền như sau:

$ ruby MyServer.rb&

Viết khách hàng SOAP4R

Lớp SOAP :: RPC :: Driver cung cấp hỗ trợ viết các ứng dụng khách SOAP. Chương này mô tả lớp này và trình bày cách sử dụng của nó trên cơ sở một ứng dụng.

Sau đây là thông tin tối thiểu mà bạn cần để gọi dịch vụ SOAP -

  • URL của dịch vụ SOAP (URL điểm cuối SOAP).
  • Không gian tên của các phương thức dịch vụ (URI không gian tên phương thức).
  • Tên của các phương thức dịch vụ và các tham số của chúng.

Bây giờ, chúng ta sẽ viết một ứng dụng khách SOAP sẽ gọi các phương thức dịch vụ được định nghĩa trong ví dụ trên, có tên là adddiv .

Dưới đây là các bước chính để tạo một ứng dụng khách SOAP.

Bước 1 - Tạo phiên bản trình điều khiển SOAP

Chúng tôi tạo một phiên bản của SOAP :: RPC :: Driver bằng cách gọi phương thức mới của nó như sau:

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

Đây là mô tả của các tham số bắt buộc -

Sr.No. Mô tả về Thông Số
1

endPoint

URL của máy chủ SOAP để kết nối.

2

nameSpace

Không gian tên để sử dụng cho tất cả các RPC được thực hiện với đối tượng SOAP :: RPC :: Driver này.

3

soapAction

Một giá trị cho trường SOAPAction của tiêu đề HTTP. Nếu nil, giá trị này mặc định là chuỗi trống "".

Bước 2 - Thêm phương thức dịch vụ

Để thêm một phương thức dịch vụ SOAP vào một SOAP :: RPC :: Driver, chúng ta có thể gọi phương thức sau bằng cách sử dụng SOAP :: RPC :: Driver instance -

driver.add_method(name, *paramArg)

Đây là mô tả của các tham số -

Sr.No. Mô tả về Thông Số
1

name

Tên của phương thức dịch vụ web từ xa.

2

paramArg

Chỉ định tên của các tham số của thủ tục từ xa.

Bước 3 - Gọi dịch vụ SOAP

Bước cuối cùng là lập hóa đơn dịch vụ SOAP bằng cách sử dụng SOAP :: RPC :: Driver instance như sau:

result = driver.serviceMethod(paramArg...)

Ở đây serviceMethod là phương thức dịch vụ web thực tế và paramArg ... là danh sách các tham số bắt buộc phải truyền trong phương thức dịch vụ.

Example

Dựa trên các bước trên, chúng tôi sẽ viết một ứng dụng khách SOAP như sau:

#!/usr/bin/ruby -w

require 'soap/rpc/driver'

NAMESPACE = 'urn:ruby:calculation'
URL = 'http://localhost:8080/'

begin
   driver = SOAP::RPC::Driver.new(URL, NAMESPACE)
   
   # Add remote sevice methods
   driver.add_method('add', 'a', 'b')

   # Call remote service methods
   puts driver.add(20, 30)
rescue => err
   puts err.message
end

Đọc thêm

Tôi đã giải thích cho bạn những khái niệm cơ bản về Dịch vụ Web với Ruby. Nếu bạn muốn đi sâu hơn, thì có liên kết sau để tìm thêm chi tiết về Dịch vụ web với Ruby .