Ruby - Web服务

首页 / Ruby / Web Services

什么是SOAP?

简单对象访问协议(SOAP)是基于XML和HTTP的跨平台且独立于语言的RPC协议。

它使用XML编码进行远程过程调用的信息,并使用HTTP通过网络将信息从客户端传输到服务器,反之亦然。

与其他技术(如COM,CORBA等)相比,SOAP具有一些优势:如相对便宜的部署和调试成本,可扩展性和易用性以及针对不同语言和平台的实现方式。

链接:https://www.learnfk.comhttps://www.learnfk.com/ruby/ruby-web-services.html

来源:LearnFk无涯教程网

安装SOAP4R

SOAP4R是Nakamura Hiroshi开发的针对Ruby的SOAP实现,可以从以下位置下载:

如果您知道 gem 实用程序,则可以使用以下命令来安装SOAP4R和相关软件包。

$gem install soap4r --include-dependencies

编写SOAP4R服务器

SOAP4R支持两种不同类型的服务器-

  • CGI/FastCGI(SOAP::RPC::CGIStub)
  • SOAP::RPC:StandaloneServer

本章详细介绍了编写独立服务器的过程。编写SOAP服务器涉及以下步骤。

第1步-继承StandaloneServer类

要实现自己的独立服务器,您需要编写一个新类,它是 SOAP::StandaloneServer 的子类,如下所示:

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

注意-如果要编写基于FastCGI的服务器,则需要将 SOAP::RPC::CGIStub 作为父类,其余过程将保持不变。

第2步-定义处理程序方法

第二步是编写您想向外界公开的Web服务方法。

它们可以编写为简单的Ruby方法。如,让无涯教程编写两个加两个数字并将两个数字相除的方法-

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

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

第3步-处理程序方法

下一步是将定义的方法添加到服务器。 initialize 方法用于通过以下两种方法之一公开服务方法:

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

这是参数的描述-

Sr.No.Parameter & Remark
1

receiver

包含methodName方法的对象。您可以在与methodDef方法相同的类中定义服务方法,此参数为 self 。

2

methodName

由于RPC请求而被调用的方法的名称。

无涯教程网

3

paramArg

指定给定的参数名称和参数模式。

要了解 inout 或 out 参数的用法,请考虑以下服务方法,该方法需要两个参数(inParam和inoutParam),返回一个正常的返回值(retVal),再返回两个参数: inoutParamoutParam -

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

现在,无涯教程可以公开此方法,如下所示:

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

第4步-启动服务器

最后一步是通过化派生类的一个并调用 start 方法来启动服务器。

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

myServer.start

这是必需参数的描述-

Sr.No.Parameter & Remark
1

ServerName

服务器名称,您可以提供最喜欢的服务器名称。

2

urn:ruby:ServiceName

这里的 urn:ruby 是常量,但是您可以为此服务器指定唯一的ServiceName名称。

3

hostname

指定此服务器将在其上侦听的主机名。

4

port

Web服务要使用的可用端口号。

现在,使用上述步骤,让无涯教程编写一个独立服务器-

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

执行后,此服务器应用程序将在 localhost 上启动独立的SOAP服务器,并在端口 8080上侦听请求。它公开了一种服务方法 adddiv ,它接受两个参数并返回输出。

现在,您可以在后台运行此服务器,如下所示:

$ruby MyServer.rb&

编写SOAP4R客户端

SOAP::RPC::Driver 类提供了对编写SOAP客户端应用程序的支持。现在,无涯教程将编写一个SOAP客户端,该客户端将调用上面示例中定义的服务方法,名为 adddiv

第1步-创建SOAP Driver程序

无涯教程通过调用如下的新方法来创建 SOAP::RPC::Driver 的-

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

这是必需参数的描述-

Sr.No.Parameter & Remark
1

endPoint

要连接的SOAP服务器的URL。

2

nameSpace

使用此SOAP::RPC::Driver对象完成的所有RPC使用的名称空间。

3

soapAction

HTTP标头的SOAPAction字段的值。如果为nil,则默认为空字符串""。

第2步-添加服务方法

要将SOAP服务方法添加到 SOAP::RPC::Driver 中,无涯教程可以使用 SOAP::RPC::Driver 调用以下方法-

driver.add_method(name, *paramArg)

这是参数的描述-

Sr.No.Parameter & Remark
1

name

远程Web服务方法的名称。

2

paramArg

指定远程过程参数的名称。

第3步-调用SOAP服务

最后一步是使用 SOAP::RPC::Driver 为SOAP服务开具发票,如下所示-

result=driver.serviceMethod(paramArg...)

这里的 serviceMethod 是实际的Web服务方法,而 paramArg ... 是传递该服务方法所需的列表参数。

基于以上步骤,无涯教程将编写一个SOAP客户端,如下所示:

#!/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

这一章《Ruby - Web服务》你学到了什么?在下面做个笔记吧!做站不易,你的分享是对我们最大的支持,感谢!😊

相关文章

Android开发高手课 -〔张绍文 - 62讲〕

设计模式之美 -〔王争 - 113讲〕

Redis核心技术与实战 -〔蒋德钧 - 53讲〕

Redis源码剖析与实战 -〔蒋德钧 - 46讲〕

Ruby 按变量条件划分数组数组

Ruby,从字符串中删除最后 N 个字符?

Ruby:“frozen_string_literal:true”有什么作用?

我可以使用 `else if` 而不是 `elsif` 吗?

Ruby:冒号之前与之后

通过多个分隔符拆分字符串

视频推荐〔Ruby - 条件控制文〕

更多视频 »
好记忆不如烂笔头。留下你的足迹吧 :)