新手问题 Ruby 调用 WebService 的问题

lionzixuanyuan · 2012年12月20日 · 最后由 shnnui 回复于 2013年08月20日 · 9580 次阅读

现在手上有两个项目,一个是我们自己团队用 ruby 开发的系统,另一个是问别人买的 java 开发的系统。要做 webService 通信,Java 那边已经做好借口,Ruby 这边负责调用,关于 Ruby 这边的相关代码如下:

strXmlDesc = @userInfo.to_xml{:only => [:name,:passward,:realname]}

require 'rubygems'
require 'soap/wsdlDrive'
url = "http://***.***.*.***:8080/********/UserManage?wsdl"

client = SOAP::WSDLDriverFactory.new(url).create_rpc_driver
result = client.registerUser(strXmlDesc )

不知为何,webService 总也调不通,Java 那边日志中一直报如下错误 Premature end of file cannot get property ‘name’ on null object 请各位有经验的提示一下~ 另外,顺便请教一下如何可以获取客户端的 MAC 地址

问题已解决 是参数传递的问题,低级错误,代码应写成: client.registerUser(:strUserXmlDesc => strXmlDesc )

序死化的问题,你看一下 ws 框架是采用什么样的方法来充列化,然后 ruby 也需要一样。

#1 楼 @ruby_sky 你是指生产的 xml 文件中各个属性标签的顺序吗?

#2 楼 @lionzixuanyuan 查一下 end of file(EOF),以及 java 的如何充列化的。你就明白了。简单的来说,ws 用 a 方式来充列化产生了对象文件 user,但是 ruby 端解析的时候却使用了 b 方式来尝试反序列化,自然而然是找不到的。

#3 楼 @ruby_sky 好的,我去了解一下,先谢谢你

#4 楼 @lionzixuanyuan 个人想法哈,仅供参考。

#5 楼 @ruby_sky 你的想法也是一个思路,集思广益更容易发现问题

#5 楼 @ruby_sky 看了半天还不是很明白,你以前遇到过这类问题吗?

#7 楼 @lionzixuanyuan 你用的是什么 ws 框架?

#8 楼 @ruby_sky 是不是回答的不专业啊?

#10 楼 @lionzixuanyuan 不是,在上班,总得有比较多空闲时间才能查吧?

#11 楼 @ruby_sky 不好意思,占用了你上班时间,我太想解决这个问题了,有点捉鸡,勿怪啊

soap。。。 为什么不选用更加通俗易懂的 http 接口,或是效率更高的 rabbitmq? 总之兼容性很重要 不要用具有 Java 特色的工具

#13 楼 @iBachue 接口规范是对方指定的,我这只是配合调用那边的方法而已

试一下 savon,我原来是用这个 gem 来调用 java 的 ws 的 https://github.com/savonrb/savon

#15 楼 @alucardpj 多谢,问题我已经解决了,是个低级问题

search_hash = {"inputCharset"=>"1", "version"=>"v2.0", "signType"=>"1", "merchantAcctId"=>"1002170855101", "queryType"=>"0", "queryMode"=>"1", "startTime"=>"", "endTime"=>"", "requestPage"=>"1", "orderId"=>"", "signMsg"=>"1961956B37842881B9788C824093E6C9"}

client = Savon.client(wsdl:"http://www.99bill.com/apipay/services/gatewayOrderQuery?wsdl", namespace: "http://gatewayquery.dto.domain.seashell.bill99.com") response = client.call(:gateway_order_query, message: search_hash)

报错了,用的是 gem "savon", "~> 2.2.0"

需要 登录 后方可回复, 如果你还没有账号请 注册新账号