新手问题 Ruby 调用 WebService 的问题

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

现在手上有两个项目,一个是我们自己团队用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 )

共收到 17 条回复

序死化的问题,你看一下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"

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