Ruby Web Service 应用 - SOAP4R
什么是 SOAP?
简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是交换数据的一种协议规范。
SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。
简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。
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 支持两种不同的服务类型:
- 独立服务 (SOAP::RPC:StandaloneServer)
- 基于 CGI/FastCGI 服务 (SOAP::RPC::CGIStub)
本教程将为大家介绍如何建立独立的 SOAP 服务。步骤如下:
第1步 - 继承SOAP::RPC::StandaloneServer
为了实现自己的独立的服务器,你需要编写一个新的类,该类为 SOAP::RPC::StandaloneServer 的子类:
class MyServer < SOAP::RPC::StandaloneServer ............... end
注意:如果你要编写一个基于FastCGI的服务器,那么你需要继承 SOAP::RPC::CGIStub 类,程序的其余部分将保持不变。
第二步 - 定义处理方法
接下来我们定义Web Service的方法,如下我们定义两个方法,一个是两个数相加,一个是两个数相除:
class MyServer < SOAP::RPC::StandaloneServer...............# 处理方法def add(a, b)return a + benddef div(a, b) return a / b end
end
第三步 - 公布处理方法
接下来添加我们在服务器上定义的方法,initialize方法是公开的,用于外部的连接:
class MyServer < SOAP::RPC::StandaloneServerdef initialize(*args)add_method(receiver, methodName, *paramArg)end
end
以下是各参数的说明:
| 参数 | 描述 |
|---|---|
| methodName | 调用 RPC 请求的方法名。 |
| receiver | 包含方法名的方法的对象。 如果你在同一个类中定义服务方法,该参数为 self。 |
| paramArg | 参数名和参数模式 |
为了理解 inout 和 out 参数,考虑以下服务方法,需要输入两个参数:inParam 和 inoutParam,函数执行完成后返回三个值:retVal、inoutParam 、outParam:
def aMeth(inParam, inoutParam)retVal = inParam + inoutParamoutParam = inParam . inoutParaminoutParam = inParam * inoutParamreturn 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:ServiceName | Here urn:ruby 是固定的,但是你可以为你的服务取一个唯一的 ServiceName |
| hostname | 指定主机名 |
| port | web 服务端口 |
实例
接下来我们通过以上的步骤,创建一个独立的服务:
实例
require "soap/rpc/standaloneserver"beginclass MyServer < SOAP::RPC::StandaloneServer# Expose our servicedef initialize(*args)add_method(self, 'add', 'a', 'b')add_method(self, 'div', 'a', 'b')end# Handler methodsdef add(a, b)return a + benddef div(a, b) return a / b endendserver = MyServer.new("MyServer", 'urn:ruby:calculation', 'localhost', 8080)trap('INT){server.shutdown}server.start
rescue => errputs 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 -wrequire 'soap/rpc/driver'NAMESPACE = 'urn:ruby:calculation'
URL = 'http://localhost:8080/'begindriver = SOAP::RPC::Driver.new(URL, NAMESPACE)# Add remote sevice methodsdriver.add_method('add', 'a', 'b')# Call remote service methodsputs driver.add(20, 30)
rescue => errputs err.message
end
相关文章:
Ruby Web Service 应用 - SOAP4R
什么是 SOAP? 简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是交换数据的一种协议规范。 SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。 简单对象访问协议是交换数据的一种协议规范,是一种轻量的、…...
HashMap底层实现原理概述
原文https://blog.csdn.net/fedorafrog/article/details/115478407 hashMap结构 常见问题 在理解了HashMap的整体架构的基础上,我们可以试着回答一下下面的几个问题,如果对其中的某几个问题还有疑惑,那就说明我们还需要深入代码,…...
Linux驱动学习环境搭建
背景常识 一、程序分类 程序按其运行环境分为: 1. 裸机程序:直接运行在对应硬件上的程序 2. 应用程序:只能运行在对应操作系统上的程序 二、计算机系统的层次结构 所有智能设备其实都是计算机,机顶盒、路由器、冰箱、洗衣机、汽…...
Java基础之异常
目录1 异常1.1 异常的概述1.2 常见异常类型1.3 JVM的默认处理方案1.4 编译时异常的处理方式1.4.1 异常处理之 try ... catch ... [ktʃ](捕获异常)1.4.2 异常处理之 throws(抛出异常)1.5 Throwable 的成员方法1.6 编译时异常和运行…...
感慨:大三了,未来该何去何从呢
笔者曾在十一月份通过了字节跳动的三次面试, 但是最终因为疫情原因不能满足公司的入职时间要求, 没有拿到offer。近期也是投递了大量大厂的实习岗, 但是要么已读不回, 要么明确告诉我学历至少要985硕士(天天被阿里cpu)。 说实话一…...
分账系统逻辑
一、说明 主体与业务关系方进行相关利益和支出的分配过程 使用场景: 在分销业务中,主营商户收到用户购买分销商品所支付的款项后,可以通过分账逻辑,与分销商进行佣金结算。在零售、餐饮等行业中,当销售人员完零售等…...
SpringCloud篇——什么是SpringCloud、有什么优缺点、学习顺序是什么
文章目录一、首先看官方解释二、Spring Cloud 的项目的位置三、Spring Cloud的子项目四、Spring Cloud 现状五、spring cloud 优缺点六、Spring Cloud 和 Dubbo 对比七、Spring Cloud 学习路线一、首先看官方解释 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式…...
TCP核心机制之连接管理详解(三次握手,四次挥手)
目录 前言: 建立连接 建立连接主要两个TCP状态: 断开连接 断开连接的两个重要状态 小结: 前言: TCP是如何建立对端连接,如何断开连接,这篇文章会详细介绍。 建立连接 首先明确连接的概念:…...
前端—环境配置
前端开发建议用 Google Chrome 浏览器 vscode https://code.visualstudio.com 1、open in browser 插件:可以在 vscode 中直接运行查看浏览器效果 2、Live Server 插件:可以使代码修改浏览器页面实时刷新。 用户代码片段 … JavaScript 与 TypeScri…...
大学生常用python变量和简单的数据类型、可迭代对象、for循环的3用法
文章目录变量和简单的数据类型下划线开头的对象删除内存中的对象列表与元组debug三酷猫钓鱼记录实际POS机小条打印使用循环找乌龟可迭代对象📗理解一📘理解二2️⃣什么是迭代器✔️注意3️⃣迭代器对象4️⃣有关迭代的函数for循环的3用法🌸I …...
Java集合:Map的使用
1.Map框架l----Map:双列数据,存储key-value对的数据 ---类似于高中的函数: y f(x)|----HashMap:作为Map的主要实现类, 线程不安全的,效率高;可以存储null的key和value|----LinkedHashMap:保证在遍历map元素时,可以按照…...
【Datawhale图机器学习】第一章图机器学习导论
图机器学习导论 学习路径与必读论文清单 斯坦福CS224W(子豪兄中文精讲)知识图谱实战DeepwalkNode2vecPageRankGNNGCNGragh-SAGEGINGATTrans-ETrans-R 图无处不在 图是描述关联数据的通用语言 举例 计算机网络新冠肺炎流行病学调查传播链食物链地铁图…...
window 配置深度学习环境GPU
CUDA 11.6 CUDNN Anaconda pytorch 参考网址:https://zhuanlan.zhihu.com/p/460806048 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) 电脑信息 RTX 2060 GPU0 1. CUDA 11.6 1.1 确认信息 C:\Users\thzn>nvidia-smi (CUDA Versi…...
VS Code 用作嵌入式开发编辑器
使用 Keil MDK 进行嵌入式开发时,Keil 的编辑器相对于主流编辑器而言有些不方便,比如缺少暗色主题、缺少智能悬停感知(鼠标停在一个宏上,能自动展开最终的宏结果)、代码补全不好用等等,所以推荐使用 VS Cod…...
【Python】网络爬虫经验之谈
爬虫经验之谈对爬虫的认识网站分析技术选型JS逆向反爬机制结语近段时间,因为工作需要做一些爬虫的开发,分享一下走过的坑和实战的经验吧!对爬虫的认识 F12查看的网络请求,找到相应的接口查看一下json数据来源和构造。我爬取的网站…...
数学建模美赛【LaTeX】公式、表格、图片
数学建模美赛【LaTeX】公式、表格、图片 1 宏包 \package{ } 就是在调用宏包,对计算机实在外行的同学姑且可以理解为工具箱。 每一个宏包里都定义了一些专门的命令,通过这些命令可以实现对于一类对象(如数学公式等)的统一排版&a…...
【大数据】YARN节点标签Node Label特性
简介 YARN 的 Node-label 特性能够将不同的机器类型进行分组调度,也可以根据不同的资源要求进行分区调度。运维人员可以根据节点的特性将其分为不同的分区来满足业务多维度的使用需求。YARN的Node-label功能将很好的试用于异构集群中,可以更好地管理和调…...
C# SolidWorks二次开发 API-命令标签页的切换与按钮错乱问题
这是一个网友咨询的问题,说他想控制默认打开文件之后solidworks上方工具栏的当前激活标签页。 之前我们提到过,制作Solidworks的插件也会在上面增加一个标签页,用来放自己开发的命令,经常开发的人肯定会遇到有时候更新版本,或者标…...
ElasticSearch 7.6.1
疑问 ES为什么这么快? 全文检索 听过一个程序扫描文本的每一个单词,针对单词建立索引,并保存该单词在文本中的位置,以及出现的次数。在检索查询时候,通过建立好的索引进行查询,将索引中单词对应的文本位…...
Linux系列 操作系统安装及服务控制(笔记)
作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.操作系统 1.Linux系统三大类 (1)ubu…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
