当前位置: 首页 > news >正文

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:ServiceNameHere urn:ruby 是固定的,但是你可以为你的服务取一个唯一的 ServiceName
hostname指定主机名
portweb 服务端口

实例

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

实例

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&#xff1f; 简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是交换数据的一种协议规范。 SOAP 是一种简单的基于 XML 的协议&#xff0c;它使应用程序通过 HTTP 来交换信息。 简单对象访问协议是交换数据的一种协议规范&#xff0c;是一种轻量的、…...

HashMap底层实现原理概述

原文https://blog.csdn.net/fedorafrog/article/details/115478407 hashMap结构 常见问题 在理解了HashMap的整体架构的基础上&#xff0c;我们可以试着回答一下下面的几个问题&#xff0c;如果对其中的某几个问题还有疑惑&#xff0c;那就说明我们还需要深入代码&#xff0c…...

Linux驱动学习环境搭建

背景常识 一、程序分类 程序按其运行环境分为&#xff1a; 1. 裸机程序&#xff1a;直接运行在对应硬件上的程序 2. 应用程序&#xff1a;只能运行在对应操作系统上的程序 二、计算机系统的层次结构 所有智能设备其实都是计算机&#xff0c;机顶盒、路由器、冰箱、洗衣机、汽…...

Java基础之异常

目录1 异常1.1 异常的概述1.2 常见异常类型1.3 JVM的默认处理方案1.4 编译时异常的处理方式1.4.1 异常处理之 try ... catch ... [ktʃ]&#xff08;捕获异常&#xff09;1.4.2 异常处理之 throws&#xff08;抛出异常&#xff09;1.5 Throwable 的成员方法1.6 编译时异常和运行…...

感慨:大三了,未来该何去何从呢

笔者曾在十一月份通过了字节跳动的三次面试&#xff0c; 但是最终因为疫情原因不能满足公司的入职时间要求&#xff0c; 没有拿到offer。近期也是投递了大量大厂的实习岗&#xff0c; 但是要么已读不回&#xff0c; 要么明确告诉我学历至少要985硕士(天天被阿里cpu)。 说实话一…...

分账系统逻辑

一、说明 主体与业务关系方进行相关利益和支出的分配过程 使用场景&#xff1a; 在分销业务中&#xff0c;主营商户收到用户购买分销商品所支付的款项后&#xff0c;可以通过分账逻辑&#xff0c;与分销商进行佣金结算。在零售、餐饮等行业中&#xff0c;当销售人员完零售等…...

SpringCloud篇——什么是SpringCloud、有什么优缺点、学习顺序是什么

文章目录一、首先看官方解释二、Spring Cloud 的项目的位置三、Spring Cloud的子项目四、Spring Cloud 现状五、spring cloud 优缺点六、Spring Cloud 和 Dubbo 对比七、Spring Cloud 学习路线一、首先看官方解释 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式…...

TCP核心机制之连接管理详解(三次握手,四次挥手)

目录 前言&#xff1a; 建立连接 建立连接主要两个TCP状态&#xff1a; 断开连接 断开连接的两个重要状态 小结&#xff1a; 前言&#xff1a; TCP是如何建立对端连接&#xff0c;如何断开连接&#xff0c;这篇文章会详细介绍。 建立连接 首先明确连接的概念&#xff1a…...

前端—环境配置

前端开发建议用 Google Chrome 浏览器 vscode https://code.visualstudio.com 1、open in browser 插件&#xff1a;可以在 vscode 中直接运行查看浏览器效果 2、Live Server 插件&#xff1a;可以使代码修改浏览器页面实时刷新。 用户代码片段 … JavaScript 与 TypeScri…...

大学生常用python变量和简单的数据类型、可迭代对象、for循环的3用法

文章目录变量和简单的数据类型下划线开头的对象删除内存中的对象列表与元组debug三酷猫钓鱼记录实际POS机小条打印使用循环找乌龟可迭代对象&#x1f4d7;理解一&#x1f4d8;理解二2️⃣什么是迭代器✔️注意3️⃣迭代器对象4️⃣有关迭代的函数for循环的3用法&#x1f338;I …...

Java集合:Map的使用

1.Map框架l----Map:双列数据&#xff0c;存储key-value对的数据 ---类似于高中的函数: y f(x)|----HashMap:作为Map的主要实现类&#xff0c; 线程不安全的&#xff0c;效率高&#xff1b;可以存储null的key和value|----LinkedHashMap:保证在遍历map元素时&#xff0c;可以按照…...

【Datawhale图机器学习】第一章图机器学习导论

图机器学习导论 学习路径与必读论文清单 斯坦福CS224W&#xff08;子豪兄中文精讲&#xff09;知识图谱实战DeepwalkNode2vecPageRankGNNGCNGragh-SAGEGINGATTrans-ETrans-R 图无处不在 图是描述关联数据的通用语言 举例 计算机网络新冠肺炎流行病学调查传播链食物链地铁图…...

window 配置深度学习环境GPU

CUDA 11.6 CUDNN Anaconda pytorch 参考网址&#xff1a;https://zhuanlan.zhihu.com/p/460806048 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) 电脑信息 RTX 2060 GPU0 1. CUDA 11.6 1.1 确认信息 C:\Users\thzn>nvidia-smi &#xff08;CUDA Versi…...

VS Code 用作嵌入式开发编辑器

使用 Keil MDK 进行嵌入式开发时&#xff0c;Keil 的编辑器相对于主流编辑器而言有些不方便&#xff0c;比如缺少暗色主题、缺少智能悬停感知&#xff08;鼠标停在一个宏上&#xff0c;能自动展开最终的宏结果&#xff09;、代码补全不好用等等&#xff0c;所以推荐使用 VS Cod…...

【Python】网络爬虫经验之谈

爬虫经验之谈对爬虫的认识网站分析技术选型JS逆向反爬机制结语近段时间&#xff0c;因为工作需要做一些爬虫的开发&#xff0c;分享一下走过的坑和实战的经验吧&#xff01;对爬虫的认识 F12查看的网络请求&#xff0c;找到相应的接口查看一下json数据来源和构造。我爬取的网站…...

数学建模美赛【LaTeX】公式、表格、图片

数学建模美赛【LaTeX】公式、表格、图片 1 宏包 \package{ } 就是在调用宏包&#xff0c;对计算机实在外行的同学姑且可以理解为工具箱。 每一个宏包里都定义了一些专门的命令&#xff0c;通过这些命令可以实现对于一类对象&#xff08;如数学公式等&#xff09;的统一排版&a…...

【大数据】YARN节点标签Node Label特性

简介 YARN 的 Node-label 特性能够将不同的机器类型进行分组调度&#xff0c;也可以根据不同的资源要求进行分区调度。运维人员可以根据节点的特性将其分为不同的分区来满足业务多维度的使用需求。YARN的Node-label功能将很好的试用于异构集群中&#xff0c;可以更好地管理和调…...

C# SolidWorks二次开发 API-命令标签页的切换与按钮错乱问题

这是一个网友咨询的问题&#xff0c;说他想控制默认打开文件之后solidworks上方工具栏的当前激活标签页。 之前我们提到过,制作Solidworks的插件也会在上面增加一个标签页&#xff0c;用来放自己开发的命令&#xff0c;经常开发的人肯定会遇到有时候更新版本&#xff0c;或者标…...

ElasticSearch 7.6.1

疑问 ES为什么这么快&#xff1f; 全文检索 听过一个程序扫描文本的每一个单词&#xff0c;针对单词建立索引&#xff0c;并保存该单词在文本中的位置&#xff0c;以及出现的次数。在检索查询时候&#xff0c;通过建立好的索引进行查询&#xff0c;将索引中单词对应的文本位…...

Linux系列 操作系统安装及服务控制(笔记)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.操作系统 1.Linux系统三大类 &#xff08;1&#xff09;ubu…...

文旅直播助农成新风口!巨有科技数智工具,复刻董宇辉“阅山河”助农模式

当下&#xff0c;文旅直播助农成为乡村振兴与文旅融合的新风口&#xff0c;董宇辉“阅山河”模式开创“边走边播、以文促农”的新范式&#xff0c;通过沉浸式文旅直播&#xff0c;实现“文旅引流农产品变现”的双向赋能&#xff0c;带动多地农产热销与文旅发展&#xff0c;但CS…...

从《贺花神》看AI趋势:当技术“理解人”,获客的方式彻底变了

今年春晚&#xff0c;一个节目让无数人屏住呼吸。故宫“白玉月令组佩”上的十二种花卉&#xff0c;化作十二位花神&#xff0c;在舞台上次第绽放。正月梅花、二月杏花、三月桃花……一人一景&#xff0c;一花一态。总导演于蕾说&#xff1a;“这非常非常难。”难在哪&#xff1…...

Python智能体内存管理实战:3步完成GC调优,90%开发者忽略的关键参数配置

第一章&#xff1a;Python智能体内存管理实战&#xff1a;3步完成GC调优&#xff0c;90%开发者忽略的关键参数配置Python的垃圾回收&#xff08;GC&#xff09;机制虽默认可靠&#xff0c;但在高吞吐、低延迟的智能体&#xff08;Agent&#xff09;场景中&#xff0c;频繁的代际…...

惊艳效果展示:实时手机检测-通用镜像识别复杂场景手机案例

惊艳效果展示&#xff1a;实时手机检测-通用镜像识别复杂场景手机案例 1. 开箱即用的手机检测神器 想象一下这样的场景&#xff1a;你需要快速检测一张照片中有多少部手机&#xff0c;可能是为了分析会议记录、监控考场纪律&#xff0c;或者统计零售店铺的顾客行为。传统方法…...

Android网络请求库终极对决:xUtils3 vs Retrofit 完整指南

Android网络请求库终极对决&#xff1a;xUtils3 vs Retrofit 完整指南 【免费下载链接】xUtils3 Android orm, bitmap, http, view inject... 项目地址: https://gitcode.com/gh_mirrors/xu/xUtils3 在Android开发的世界中&#xff0c;网络请求是每个应用的核心功能之一…...

AI歌声转换技术全解析:从原理到商业落地的实践指南

AI歌声转换技术全解析&#xff1a;从原理到商业落地的实践指南 【免费下载链接】so-vits-svc 基于vits与softvc的歌声音色转换模型 项目地址: https://gitcode.com/gh_mirrors/sovit/so-vits-svc AI歌声转换技术正在重塑音乐创作与声音处理的边界&#xff0c;通过深度学…...

FastAPI-依赖注入

一、什么是依赖注入依赖注入&#xff08;Dependency Injection&#xff09;是一种设计模式&#xff0c;用于管理组件之间的依赖关系。在 FastAPI 中&#xff0c;它用于&#xff1a;共享数据库连接强制执行安全性和认证参数验证代码复用二、基础依赖from fastapi import Depends…...

Windows平台最强播放器?Potplayer这5个隐藏画质设置让老片焕然新生

Windows平台最强播放器&#xff1f;PotPlayer这5个隐藏画质设置让老片焕然新生 每次打开那些年代久远的经典影片&#xff0c;总会被模糊的画质和噪点劝退&#xff1f;别急着放弃&#xff0c;你手头的PotPlayer可能就是被低估的画质修复神器。不同于普通播放器的简单解码功能&am…...

Show-o:揭秘多模态统一架构背后的Transformer与扩散建模融合之道

1. Show-o&#xff1a;多模态AI的"变形金刚" 想象一下&#xff0c;如果有一个AI模型既能看懂你发的照片&#xff0c;又能根据你的文字描述生成精美图片&#xff0c;还能回答关于图像的各种问题——这就是Show-o正在做的事情。作为多模态AI领域的最新突破&#xff0c;…...

GetQzonehistory完整教程:三步轻松备份QQ空间所有历史说说

GetQzonehistory完整教程&#xff1a;三步轻松备份QQ空间所有历史说说 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间中的珍贵回忆随着时间流逝而消失&#xff1f;Get…...