利用Ruby的SOAP4R编写SOAP服务器的教程

 什么是SOAP ?

简单对象访问协议(SOAP)是一个跨平台和语言无关的,基于XML的RPC协议,通常(但不一定)是HTTP。

它使用XML来编码信息使远程过程调用,HTTP在网络上从客户机到服务器来传输信息,反之亦然。

SOAP有几个优势超过其他技术,如COM,CORBA等为例,其相对廉价的部署和调试成本,它的可扩展性和易于使用,存在几种不同的语言和平台实现。

请参阅出简单的教程了解 SOAP

本教程将熟悉SOAP实现Ruby(SOAP4R)。这是一个基本的教程,所以如果需要深入细节,那么需要参考其他资源。
安装SOAP4R:

SOAP4R是由Hiroshi Nakamura编定,可以直接从网上下载Ruby的开发的SOAP实现:

注意:有可能已经安装了这个组件。

Download SOAP

如果知道 gem 实用工具,那么可以使用下面的命令安装SOAP4R和相关包。

$ gem install soap4r --include-dependencies

如果是在Windows上工作,那么需要下载一个压缩文件,从上面的位置,需要安装它使用标准的安装方法运行Ruby的 install.rb.
编写SOAP4R服务器:

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

  1. CGI/FastCGI based (SOAP::RPC::CGIStub)
  2. Standalone (SOAP::RPC:StandaloneServer)

本教程将详细编写一个独立的服务器。涉及编写SOAP服务器有以下步骤:
第1步 - 继承SOAP::RPC::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

下面的参数说明:

To understand the usage of inout or out parameters, consider the following service method that takes two parameters (inParam and inoutParam), returns one normal return value (retVal) and two further parameters: inoutParam and outParam:

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

这是必需的参数的描述:

例如:

现在使用上述步骤,让我们写一个独立的服务器:

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

执行时,服务器应用程序开始一个独立的SOAP服务在localhost上侦听8080端口的请求。它暴露了一个服务方法:add 和 div ,这需要两个参数并返回结果。

现在可以运行这个服务器后台如下:

$ ruby MyServer.rb&

编写SOAP4R客户端:

SOAP::RPC::Driver 类用于写入SOAP客户端应用程序提供支持。本教程将介绍这个类,显示其使用的应用程序的基础。

以下是最低要求的信息,需要调用SOAP服务:

  • SOAP服务(SOAP端点URL)
  • service方法(方法命名空间URI)
  • service方法的名称及其参数

现在我们将编写一个SOAP客户端调用服务定义的方法在上面的例子名称为add和div。

以下是主要的步骤来创建一个SOAP客户端:
步骤1 - 创建一个SOAP驱动程序实例:

我们创建一个实例 SOAP::RPC::Driver 通过调用 new 方法如下:

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

这是必需的参数的描述:

 第2步 - 添加服务的方法:

要添加到SOAP SOAP服务方法到 SOAP::RPC::Driver 我们可以调用下面的方法使用 SOAP::RPC::Driver 实例:

driver.add_method(name, *paramArg)

下面的参数说明:

第3步 - 调用SOAP服务:

最后一步是调用SOAP服务使用 SOAP::RPC::Driver 实例如下:

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
(0)

相关推荐

  • 详细介绍Ruby中的正则表达式

    正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找其他字符串或字符串集合. 语法 正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的模式,如下所示: /pattern/ /pattern/im # 可以指定选项 %r!/usr/local! # 一般的分隔的正则表达式 实例 #!/usr/bin/ruby line1 = "Cats are smarter than dogs"; line2 = "Dogs also like m

  • 在Ruby程序中连接数据库的详细教程

    本章节将向您讲解如何使用 Ruby 访问数据库.Ruby DBI 模块为 Ruby 脚本提供了类似于 Perl DBI 模块的独立于数据库的接口. DBI 即 Database independent interface,代表了 Ruby 独立于数据库的接口.DBI 在 Ruby 代码与底层数据库之间提供了一个抽象层,允许您简单地实现数据库切换.它定义了一系列方法.变量和规范,提供了一个独立于数据库的一致的数据库接口. DBI 可与下列进行交互: ADO (ActiveX Data Object

  • Ruby的面向对象编程的基础教程

    Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象.类本身也是一个对象,是 Class 类的一个实例.本章将向您讲解所有与 Ruby 面向对象相关的主要功能. 类用于指定对象的形式,它结合了数据表示法和方法,把数据整理成一个整齐的包.类中的数据和方法被称为类的成员. Ruby 类定义 当您定义一个类时,您实际是定义了一个数据类型的蓝图.这实际上并没有定义任何的数据,而

  • 利用Ruby的SOAP4R编写SOAP服务器的教程

     什么是SOAP ? 简单对象访问协议(SOAP)是一个跨平台和语言无关的,基于XML的RPC协议,通常(但不一定)是HTTP. 它使用XML来编码信息使远程过程调用,HTTP在网络上从客户机到服务器来传输信息,反之亦然. SOAP有几个优势超过其他技术,如COM,CORBA等为例,其相对廉价的部署和调试成本,它的可扩展性和易于使用,存在几种不同的语言和平台实现. 请参阅出简单的教程了解 SOAP 本教程将熟悉SOAP实现Ruby(SOAP4R).这是一个基本的教程,所以如果需要深入细节,那么需

  • C++编写高性能服务器实例教程

    我将展示如何使用现代C++编写一个Echo服务器,相当于分布式系统开发中的"Hello World".这个服务器会将接收的消息直接返回.我们同时需要一个可以向我们的服务器发动消息的客户端,在这里可以发现客户端的源码. Wangle是一个用来搭建事件驱动的现代异步C++服务的C/S应用框架.Wangle最基本的抽象概念就是Pipeline(管线).能够理解这种抽象,将会很容易写出各种复杂的现代C++服务,另一个重要的概念是Service(服务),其可以看作一种更高级的Pipeline,不

  • Java利用TCP协议实现客户端与服务器通信(附通信源码)

    进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的这篇文章"盘点那些进行网络编程必须要知道的基础知识",那么今天大灰狼就来和大家分享一下如何使用TCP/IP进行网络程序的开发. TCP协议概念 先来了解一下TCP协议的基本概念. 我们知道TCP是可靠

  • 利用nginx与ffmpeg搭建流媒体服务器过程详解

    需求 本文介绍的是利用nginx和ffmpeg搭建流媒体服务器的过程.例如这种场景:公司内部需要同时观看在线直播时,如果每个人直接观看必然给出口带宽带来压力,影响正常访问外网的同事.所以可以在内网通过nginx+ffmpeg拉一路直播流,然后内网的用户访问内网的这台流媒体服务器即可.通过nginx+ffmpeg还可以实现推流.拉流.转推甚至利用FFmpeg实时切片.视频处理等,实现一套直播服务模型. 环境 系统环境:CentOS release 6.7 (Final) 步骤 安装ffmpeg 安

  • maven利用tomcat插件部署远程Linux服务器的步骤详解

    前言 本文主要给大家介绍了关于maven利用tomcat插件部署远程Linux服务器的相关内容,分享出来供大家参考学习,下面话不多说了,来一看看详细的介绍吧. 环境 服务器: Ubuntu 16.04(阿里云服务器) jdk版本:1.8 相关的maven插件: 这个插件的目的在于部署时,跳过测试 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-pl

  • 使用TS来编写express服务器的方法步骤

    1. 前言 作为前端开发人员而言,ts已经成为了一项必不可少的技能,类型检查可以帮助我们再开发时避免一些不必要的bug,而且ts支持的类和装饰器等语法也更逼近后端语言,更适合服务器的开发. 本文将从零开始,搭建一个集成ts和eslint语法检查的express服务器. 2. 初始化express框架 我们可以使用官方提供的express生成器来快速生成express框架. 当然,express的初始化内容并不复杂,你也可以从一个app.js开始搭建自己喜欢的框架模式. # 使用express生成

  • 群晖NAS利用Docker容器搭建KMS激活服务器实现激活windows系统和office(操作步骤)

    前言 Windows系统中能够通过KMS进行激活的一般称为VL版,即VOLUME授权版.我们可以自行搭建KMS激活服务器,实现每180天一次的自动激活,使得系统一直保持激活状态.这次就跟大家分享一下如何利用群晖NAS的Docker容器套件搭建KMS服务器,并演示如何利用我们自己的KMS服务器激活Windows操作系统与Microsoft Office. 操作步骤 先到套件中心安装Docker套件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCVBfkb9-15

  • 教你利用JAVA实现可以自行关闭服务器的方法

    JAVA实现可以自行关闭的服务器 普通实现的服务器都无法关闭自身,只有依靠操作系统来强行终止服务程序.这种强行终止服务程序的方式尽管简单方便,但会导致服务器中正在执行的任务突然中断.如果服务器处理的任务非常重要,不允许被突然中断,应该由服务器自身在恰当的时刻关闭自己 代码如下: EchoServer类 package ShutdownServer; import java.io.*; import java.net.ServerSocket; import java.net.Socket; im

  • Python利用物理引擎Pymunk编写一个解压小游戏

    用鼠标创建小球,一个蹦来蹦去的解压小游戏…… 本次需要的外置包:pygame,pymunk,cmd运行该命令安装: pip install pygame pip install pymunk 首先,导入 import pymunk import pygame from pygame.locals import * import sys import random as rd 结合pygame,创建若干障碍,并设置重力.弹跳力等参数  class Demo: WIDTH=800 HEIGHT=80

  • 在Ruby on Rails中使用AJAX的教程

    如果没有听说过 Rails,那么欢迎您外星旅行归来,近几年大概只有那个地方没有听说过 Ruby on Rails 了.Rails 最吸引人的地方是能够很快地建立功能完备的应用程序并运行起来.Rails 为 Ajax 而内置集成的 Prototype.js 库可以轻松快速地创建所谓的富 Internet 应用程序. 本文将逐步引导您创建 Rails 应用程序.然后深入分析如何利用 Ajax 特性编写从服务器上读写数据的 JavaScript 代码. 从容起步 Ajax 之旅--Ajax 技术资源中

随机推荐