0

我正在处理来自服务器的 SOAP webservice 调用,该服务器期望接收具有以下格式的参数的方法调用:

<urn:offeringId> 354 </urn:offeringId>

但是 SOAP::RPC::Driver 正在生成以下形式的消息:

<offeringId xsi:type = "xsd:int">354</offeringId>

服务器在收到这些消息时会不断出错(特别是因为它期望 offerId 是其自身内部的自定义类型,而不是 int)。

无论如何配置驱动程序以按照服务器期望的方式格式化事物。服务器甚至在做 SOAP 吗?我很难找到对 SOAP 格式格式的引用(我知道它确实有效,因为 SOAPUI 可以很好地处理这种类型的消息)。

-珍妮

编辑:我至少已经解决了一部分。RPC::Driver (显然)使用 RPC 标准,而显然我试图与之交谈的服务器正在执行“文档”。现在,当我查看 RPC::Driver 的 API 时,我看到了一个名为“add_document_method”的方法。在我看来,这可能是我想要的,但我不知道要给它什么参数。我在网上看到的例子对我来说没有多大意义,比如:

def GetNamePair(response)
  response.account.each do |x| 
    class << x
      attr :configuration, true    
    end     
    x.configuration = Hash[*x.a.map do |y|
      [y.__xmlattr[XSD::QName.new(nil, 'n')], String.new(y)]
    end.flatten] 
  end
end

mNS = 'urn:zimbraAdmin'
drv.add_document_method('GetAllAdminAccountsRequest', mNS, [XSD::QName.new(mNS, 'GetAllAdminAccountsRequest')],  
  [XSD::QName.new(mNS, 'GetAllAdminAccountsResponse')] )  

puts YAML.dump(GetNamePair(drv.GetAllAdminAccountsRequest([]))

我真正知道的是我有一个接受某些参数的方法......我真的不明白为什么,如果这个方法做了我认为它做的事情,它必须更复杂。这不只是获取完全相同的数据并以不同的方式格式化它的问题吗?我很混乱....

4

1 回答 1

0

好吧,我最终做的是使用 SOAP:RPC:Drivers add_document_method,这需要我给它 wsdl、命名空间等,然后给它属性作为一个单一的输入哈希值(并给我一个输出类似的格式)。它起作用了,只是不如 add_rpc_method 干净(这是 add_method 默认的)

-珍妮

于 2009-07-21T13:50:29.087 回答