`

soap客户端

阅读更多

选择

ruby带有soap4r的插件,可以用于访问web service服务接口,但不支持basic_auth、WS-Security
因此选用handsoap作为客户端插件

安装

#curb在window下安装很麻烦,改为指定httpclient
#sudo gem install handsoap curb nokogiri httpclient --no-ri --no-rdoc
sudo gem install handsoap nokogiri httpclient --no-ri --no-rdoc
#如果安装curb过程报cannot find -lcur错误,则运行
sudo apt-get install libcurl4-openssl-dev
#environment.rb中加入
config.gem 'handsoap', :lib => 'handsoap', :source => "http://gems.github.com"

#curb在window下安装很麻烦,改为指定httpclient,environment.rb中最底部加入
Handsoap.http_driver=:httpclient

使用

#生成客户端类
script/generate handsoap http://192.168.1.20:8081/cmis/webService/ciisStatService?wsdl

配置管理员需要配置的地方在这里(用户、密码、接口地址)

#生成的连接地址加入environments/production.rb中
CIIS_USERNAME = 'cogent'
CIIS_PASSWORD = 'cogent'

CIIS_STAT_SERVICE_IMPL_SERVICE_ENDPOINT = {
  :uri => 'http://192.168.1.20:8081/cmis/webService/ciisStatService',
  :version => 1
}
#script/console
s = Ciis::PopService.find_pop '%'
#获取列表对象
s.list
#获取列表对象中的内容
s.list.first.name
#获取属性值
s.size

调试

使用soapui访问webservice接口,确保服务正常
为了监控客户端与服务器的交互内容,可使用tcpmon架设代理

soapui
tcpmon

soapui简要介绍

注意,连接接口时要设置用户名密码,双击某个接口方法的请求(一般为request1),点击弹出的右边窗口左下方的[Aut],输入用户名、密码
然后在Request1窗口中点击右键,选择[Add WSS Username Token],会看到请求的xml中增加了用户名、密码

问题

#按照handsoap官方说明无法实现ws-security的访问
#提示Security processing failed (actions mismatch)
#经过尝试,以下调用是成功的
  def on_create_document(doc)
    #register namespaces for the request
    doc.alias 'tns', 'http://ws.stat.wsif.cogent.com/'
    doc.alias 's', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'
    header = doc.find("Header")
    header.add "s:Security" do |s| 
      #增加此节点,否则会报错
      s.add "s:UsernameToken" do |t|                                                                                                                         
        t.add "s:Username", "cogent"
        t.add "s:Password", "cogent"
      end 
    end 
  end

[第二个问题]开发环境下报错:ArgumentError: A copy of Ciis::PopService has been removed from the module tree but is still active!

#重现步骤
script/console
  Ciis::PopService.find_pop('%') 
  reload!
  #再次执行报错
  Ciis::PopService.find_pop('%')

产品环境下没问题,但由于开发环境下class会被缓存,而handsoap静态方法引用了实例对象
在handsoap源代码中发现以下语句

@@instance = {}
def self.instance
  @@instance[self.to_s] ||= self.new
end 
def self.method_missing(method, *args, &block)
  if instance.respond_to?(method)
    instance.__send__ method, *args, &block
  else
    super
  end 
end

因此在开发环境下需要重载instance静态方法

#config/initializers/fixed_handsoap_reload_error.rb
unless development?
  module Handsoap
    class Service
      def self.instance
        self.new
      end 
    end 
  end 
end
#测试是否解决问题了
script/console
  #确保每次获取的实例对象不一样
  Ciis::PopService.instance
  Ciis::PopService.instance
分享到:
评论

相关推荐

    2022年使用Visual C++开发SOAP客户端应用C语言教程.docx

    C++开发SOAP客户端应用教程 本文档将指导读者如何使用Visual C++开发一个简洁的SOAP客户端应用程序,并介绍SOAP API的运用。SOAP是一种特别流行的交换信息用的协议,能够与HTTP、SMTP和其他类似协议协同工作。为了...

    MFC下实现SOAP服务端和SOAP客户端

    接着,是SOAP客户端的构建。在MFC中,你可以使用CInternetSession和CFtpConnection等类来建立与服务端的连接。gSoap库同样提供了客户端SDK,允许你生成与服务端通信所需的代理类。这些代理类封装了SOAP消息的构建和...

    关于soap客户端附件上传相关资料

    3. **创建SOAP客户端**:使用像Java的Apache CXF、.NET的SoapHttpClient或者Python的zeep这样的库,这些库通常提供了处理SOAP和附件的API。 4. **设置MTOM或SwA支持**:在客户端配置中启用MTOM或SwA支持。例如,在...

    soap客户端工具

    **SOAP客户端工具详解** 在IT行业中,Web服务的交互是一个重要的环节,而SOAP(Simple Object Access Protocol)协议作为XML(eXtensible Markup Language)格式的网络通信协议,广泛用于分布式系统之间的数据交换...

    Python SOAP 客户端.zip

    ZeepPython SOAP clienthon SOAP 客户端亮点兼容 Python 3.9、3.10、3.11、3.12、3.13 和 PyPy3基于 lxml、requests 和 httpx 构建支持 Soap 1.1、Soap 1.2 和 HTTP 绑定支持 WS-Addressing 标头支持 WSSE ...

    使用SAAJ 和JAXM的 SOAP客户端及服务

    通过SAAJ,开发者可以构建SOAP客户端来发起请求,或创建SOAP服务来接收和响应请求。SAAJ支持同步消息传递模式,即请求-响应模式,其中客户端发送一个请求,然后等待服务器的响应。 **JAXM(Java API for XML ...

    Node.js-node.js的SOAP客户端和服务器

    标题“Node.js-node.js的SOAP客户端和服务器”表明我们将讨论如何在 Node.js 中使用 `node-soap` 模块来创建 SOAP 客户端和服务器,以便与外部Web服务进行通信,或构建自己的SOAP API。 描述中的“此模块允许您使用...

    使用Visual C开发SOAP客户端应用.doc

    ### 使用Visual C++开发SOAP客户端应用 #### 一、引言 SOAP(Simple Object Access Protocol,简单对象访问协议)是一种轻量级协议,用于在Web应用程序之间交换结构化的信息。它基于XML,允许应用程序跨平台、跨...

    通用SOAP客户端SOAPEngine.zip

    SOAPEngine 是通用的 SOAP 客户端,允许你使用一个 iOS 或者 OS X 应用访问 WEB 服务。使用 SOAPEngine 这个框架可以创建 iPhone,iPad 和 Mac OS X 支持 SOAP 客户端协议的应用。 标签:SOAPEngine

    node-soap, 用于 node.js的SOAP客户端和服务器.zip

    node-soap, 用于 node.js的SOAP客户端和服务器 Soap 用于 node.js.的SOAP客户端和服务器这里 MODULE 允许你使用SOAP连接到 Web服务 。 它还提供了一个服务器,允许你运行自己的SOAP服务。特性:安装失败为什么我不能...

    SOAP客户端用例

    SOAP客户端是使用SOAP协议与远程Web服务进行通信的应用程序。在本案例中,我们将探讨如何创建和使用SOAP客户端,特别是在使用Apache Axis2工具时。 首先,`TestClient.java`文件可能包含了SOAP客户端的Java代码示例...

    Ruby-Savon是一个Ruby编程语言的SOAP客户端

    在使用Savon时,你需要定义SOAP客户端,提供服务的WSDL(Web Service Description Language)地址。WSDL文件是一个XML文档,包含了服务的所有方法、参数和返回类型。Savon会自动分析这个文件,生成对应的客户端API。...

    Node.js的SOAP客户端和服务器Node-SOAP.zip

    Node-SOAP 是基于 Node.js 的 SOAP 客户端和服务器。 该模块可以让你使用SOAP连接到Web服务。它还提供了一个服务器,它允许你运行你自己的SOAP服务。特性非常简单的 API可以处理 RPC 和 Document schema 类型支持...

    C++ 开发SOAP服务端和SOAP客户端

    利用gSOAP自带的Calc例子 仿写一个 网络中使用计算器 客户端发送需要操作的数据,服务端计算完之后,将结果返回给客户端 编写之后 我们的服务端可独立使用。像在安装了IIS或者用Apache配置的Web服务器。

    Laravel开发-laravel-soap Soap 协议客户端

    在Laravel项目中,使用`laravel-soap`扩展包可以方便地集成SOAP客户端功能。这个扩展包提供了一套简单易用的API,使得开发者无需直接与复杂的SOAP XML交互,而是通过面向对象的方式处理SOAP请求和响应。 **安装与...

    客户端调用webservice方式一(soap请求)

    本教程将详细讲解客户端如何通过SOAP(Simple Object Access Protocol)请求调用WebService,以实现根据订单号获取订单的物流信息。 **SOAP请求详解** SOAP是一种XML(eXtensible Markup Language)格式的消息协议...

    基于 .NET, Java and MS SOAP Toolkit进行Web Services 的客户端调用程序例子

    1. **创建SOAP客户端**:利用Toolkit提供的模板和向导,创建SOAP客户端代码。 2. **构建SOAP消息**:根据服务的WSDL定义,手动构造SOAP请求消息。 3. **发送和接收消息**:使用Toolkit的函数发送SOAP请求,并捕获...

Global site tag (gtag.js) - Google Analytics