Ruby Web Services 应用 - SOAP4R

  什么是 SOAP?

  简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是交换数据的一种协议规范。

  SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。

  简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

  更多 SOAP 教程请查看:http://www.w3cschool.cc/soap/soap-tutorial.html。

  SOAP4R 安装

  SOAP4R 由Hiroshi Nakamura开发实现,用于 Ruby 的 SOAP 应用。

  SOAP4R 下载地址:http://raa.ruby-lang.org/project/soap4r/。

  注意:你的ruby环境可能已经安装了该该组件。

  Linux 环境下你也可以使用 gem 来安装该组件,命令如下:

  $ gem install soap4r --include-dependencies

  如果你是window环境下开发,你需要下载zip压缩文件,并通过执行 install.rb 来安装。

  SOAP4R 服务

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

  基于 CGI/FastCGI 服务 (SOAP::RPC::CGIStub)

  独立服务 (SOAP::RPC:StandaloneServer)

  本教程将为大家介绍如何建立独立的 SOAP 服务。步骤如下:

  第1步 - 继承SOAP::RPC::StandaloneServer

  为了实现自己的独立的服务器,你需要编写一个新的类,该类为 SOAP::RPC::StandaloneServer 的子类:

  class MyServer < SOAP::RPC::StandaloneServer

  ...............

  end

  注意:如果你要编写一个基于FastCGI的服务器,那么你需要继承 SOAP::RPC::CGIStub 类,程序的其余部分将保持不变。

  第二步 - 定义处理方法

  接下来我们定义Web Services的方法,如下我们定义两个方法,一个是两个数相加,一个是两个数相除:

  class MyServer < SOAP::RPC::StandaloneServer

  ...............

  # 处理方法

  def add(a, b)

  return a + b

  end

  def div(a, b)

  return a / b

  end

  end

  第三步 - 公布处理方法

  接下来添加我们在服务器上定义的方法,initialize方法是公开的,用于外部的连接:

  class MyServer < SOAP::RPC::StandaloneServer

  def initialize(*args)

  add_method(receiver, methodName, *paramArg)

  end

  end

  以下是各参数的说明:

  参数描述

  receiver包含方法名的方法的对象。 如果你在同一个类中定义服务方法,该参数为 self。

  methodName调用 RPC 请求的方法名。

  paramArg参数名和参数模式

  为了理解 inout 和 out 参数,考虑以下服务方法,需要输入两个参数:inParam 和 inoutParam,函数执行完成后返回三个值:retVal、inoutParam 、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)

  ])

  第四步 - 开启服务

  最后我们通过实例化派生类,并调用 start 方法来启动服务:

  myServer = MyServer.new('ServerName',

  'urn:ruby:ServiceName', hostname, port)

  myServer.start

  以下是请求参数的说明:

  参数描述

  ServerName服务名,你可以取你喜欢的

  urn:ruby:ServiceNameHere urn:ruby 是固定的,但是你可以为你的服务取一个唯一的 ServiceName

  hostname指定主机名

  portweb 服务端口

  实例

  接下来我们通过以上的步骤,创建一个独立的服务:

  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

  执行以上程序后,就启动了一个监听 8080 端口的本地服务,并公开两个方法:add 和 div。

  你可以再后台执行以上服务:

  $ ruby MyServer.rb&

  SOAP4R 客户端

  ruby 中使用 SOAP::RPC::Driver 类开发 SOAP 客户端。接下来我们来详细看下 SOAP::RPC::Driver 类的使用。

  调用 SOAP 服务需要以下信息:

  SOAP 服务 URL 地址 (SOAP Endpoint URL)

  服务方法的命名空间(Method Namespace URI)

  服务方法名及参数信息

  接下来我们就一步步来创建 SOAP 客户端来调用以上的 SOAP 方法:add 、 div:

  第一步 - 创建 SOAP Driver 实例

  我们可以通过实例化 SOAP::RPC::Driver 类来调用它的新方法,如下所示:

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

  以下是参数的描述:

  参数描述

  endPoint连接 SOAP 服务的 URL 地址

  nameSpace命名空间用于 SOAP::RPC::Driver 对象的所有 RPC .

  soapAction用于 HTTP 头部的 SOAPAction 字段值。如果是字符串是"" 则默认为 nil

  第二步 - 添加服务方法

  为 SOAP::RPC::Driver 添加 SOAP 服务方法,我们可以通过实例 SOAP::RPC::Driver 来调用以下方法:

  driver.add_method(name, *paramArg)

  以下是参数的说明:

  参数描述

  name远程web服务的方法名

  paramArg指定远程程序的参数

  第三步 - 调用SOAP服务

  最后我们可以使用 SOAP::RPC::Driver 实例来调用 SOAP 服务:

  result = driver.serviceMethod(paramArg...)

  serviceMethod SOAP服务的实际方法名,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 Services 。 (编辑:雷林鹏 来源:网络)

转载于:https://www.cnblogs.com/pengpeng1208/p/10131234.html

雷林鹏分享:Ruby Web Services 应用 - SOAP4R相关推荐

  1. 老李分享:Web Services 组件 1

    老李分享:Web Services 组件 在过去的几年里,三大主流技术已经成为构成当今 web service 技术的全球标准.接下来我们来讨论一下这些技术. XML-RPC XML-RPC 是在计算 ...

  2. 雷林鹏分享:Ruby XML, XSLT 和 XPath 教程

    Ruby XML, XSLT 和 XPath 教程 什么是 XML ? XML 指可扩展标记语言(eXtensible Markup Language). 可扩展标记语言,标准通用标记语言的子集,一种 ...

  3. 雷林鹏分享:Ruby 字符串(String)

    Ruby 字符串(String) Ruby 中的 String 对象存储并操作一个或多个字节的任意序列,通常表示那些代表人类语言的字符. 最简单的字符串是括在单引号(单引号字符)内.在引号标记内的文本 ...

  4. 雷林鹏分享:Ruby 正则表达式

    Ruby 正则表达式 正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找其他字符串或字符串集合. 语法 正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的 ...

  5. 雷林鹏分享:MySQL 及 SQL 注入

    MySQL 及 SQL 注入 如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入 ...

  6. 雷林鹏分享:PHP 超级全局变量

    超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用. PHP 超级全局变量 PHP中预定义了几个超级全局变量(superglobals) ,这意味着 ...

  7. 雷林鹏分享:Redis 管道技术

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...

  8. 雷林鹏分享:Lua 错误处理

    程序运行中错误处理是必要的,在我们进行文件操作,数据转移及web service 调用过程中都会出现不可预期的错误.如果不注重错误信息的处理,就会造成信息泄露,程序无法运行等情况. 任何程序语言中,都 ...

  9. 雷林鹏分享:YII 模型-视图-控制器(MVC)设计模式

    Yii 使用了 Web 开发中广泛采用的模型-视图-控制器(MVC)设计模式. MVC的目标是将业务逻辑从用户界面的考虑中分离,这样开发者就可以更容易地改变每一部分而不会影响其他. 在 MVC中,模型 ...

最新文章

  1. 语音识别:时间序列的Smith–Waterman对齐算法
  2. 网易云信SDK V3.2.0版发布啦!
  3. 命题公式的主合取范式C语言,命题公式主范式的自动生成与形式输出.pdf
  4. 项目管理知识体系指南_MP考前冲刺丨项目管理知识体系指南(PMBOK)串讲(11)...
  5. 圣诞海报模板|给设计师点灵感
  6. C语言中利用联合体巧妙处理数据
  7. 【物理应用】基于matlab Q学习无线体域网路由方法【含Matlab源码 264期】
  8. 我是如何做测试项目管理的
  9. windows使用放大镜快速放大屏幕局部
  10. Android 项目必备(三十二)-->APP 项目产品介绍
  11. 测试网速_怎样测试两台电脑之间的网速
  12. 工业计算机控制系统的分类,工业自动化系统组成和产品分类介绍
  13. 鲸探发布点评:7月7日发售陈孟昕系列绘画数字藏品
  14. 问卷调查的数据如何分析?
  15. 百度飞桨AI达人创造营 | Day01:创意是如何诞生的
  16. android 各种分辨率的logo大小
  17. 笔记本怎么用android,电脑上如何使用Android系统
  18. C++ POCO库(访问数据库,版本问题,本人配置失败)
  19. matlab与卡尔曼滤波pdf,Kalman滤波器理论与应用:基于MATLAB实现 完整pdf高清版[3MB]...
  20. 关于DMA,TCM(ITCM和DTCM)和Cache的理解!

热门文章

  1. 关于双等号判断的深入面试题
  2. 《剑指offer》连续子数组的最大和
  3. 小球弹起次数及高度(python)
  4. TensorFlow学习笔记(十九) 基本算术运算和Reduction归约计算
  5. TensorFlow学习笔记(十六)tf.random_normal
  6. Scala入门到精通——第十九节 隐式转换与隐式参数(二)
  7. SPARK RDD JAVA API 用法指南
  8. Java面试中常问的Spring方面问题
  9. Spark MLlib实现的广告点击预测–Gradient-Boosted Trees
  10. JAVA并发编程: CAS和AQS