我正在尝试将我的rails应用程序与基于SOAP的Web服务集成。作为SOAP的新手,我参考了this来开始。
我的第一步是使用Savon创建一个客户端:client = Savon.client(wsdl: "https://xxxx.xxxx.xxxx/Reg/ABCRegService.svc?wsdl")
现在,当我执行client.operations
时,我得到一个[]
WSDL看起来像这样(为了安全,我屏蔽了值字段)
<wsdl:definitions name="some_name" targetNamespace="some_targetNamespace">
<wsdl:import namespace="some_Namespace1" location="some_nameService.svc?wsdl=wsdl0"/>
<wsdl:types>
<xsd:schema targetNamespace="some_targetNamespaceImports">
<xsd:import schemaLocation="http://example.net/some_name/some_Service.svc?xsd=xsd0" namespace="some_targetNamespace"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="some_name_RegisterTool_InputMessage">
<wsdl:part name="parameters" element="tns:RegisterTool"/>
</wsdl:message>
<wsdl:message name="some_name_RegisterTool_OutputMessage">
<wsdl:part name="parameters" element="tns:RegisterToolResponse"/>
</wsdl:message>
<wsdl:message name="UnregisterToolRequest">
<wsdl:part name="parameters" element="tns:UnregisterToolRequest"/>
</wsdl:message>
<wsdl:message name="UnregisterToolRequest_Headers">
<wsdl:part name="AuthenticationHeader" element="tns:AuthenticationHeader"/>
</wsdl:message>
<wsdl:message name="UnregistrationResult">
<wsdl:part name="parameters" element="tns:UnregistrationResult"/>
</wsdl:message>
<wsdl:portType msc:usingSession="false" name="some_name">
<wsdl:operation name="RegisterTool">
<wsdl:input wsaw:Action="some_targetNamespacesome_name/RegisterTool" message="tns:some_name_RegisterTool_InputMessage"/>
<wsdl:output wsaw:Action="some_targetNamespacesome_name/RegisterToolResponse" message="tns:some_name_RegisterTool_OutputMessage"/>
</wsdl:operation>
<wsdl:operation name="UnregisterTool">
<wsdl:input wsaw:Action="some_targetNamespacesome_name/UnregisterTool" name="UnregisterToolRequest" message="tns:UnregisterToolRequest"/>
<wsdl:output wsaw:Action="some_targetNamespacesome_name/UnregisterToolResponse" name="UnregistrationResult" message="tns:UnregistrationResult"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:service name="some_name">
<wsdl:port name="WSHttpBinding_some_name" binding="i0:WSHttpBinding_some_name">
<soap12:address location="https://example.net/Dcsome_name/some_nameService.svc"/>
<wsa10:EndpointReference>
<wsa10:Address>https://example.net/Dcsome_name/some_nameService.svc</wsa10:Address>
<Identity>
<Dns>localhost</Dns>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
我研究了类似的问题,例如this。
client = Savon.client(
endpoint: 'proper_endpoint',
soap_action: "proper_soap_action",
namespace: 'proper_namespace',
convert_request_keys_to: :camelcase,
env_namespace: :soapenv
)
我得到了:
:在`method_missing '中:未知全局选项::soap_action(Savon::UnknownOptionError)。
有什么办法能挺过去吗?
环境:
- 操作系统:Windows 7(使用RailsInstaller安装rails)
- Ruby版本:2.0.0
- 萨翁:2
- Rails 4.1.8
更新:我试着从SOAPUI中调用相同的WSDL
- 将
WS-Addressing
属性设置为true
, - 选中
Add default wsa:to
的复选框, - 使用
<![CDATA[]>
传递标识符参数。
任何线索如何设置这些东西,而创建Savon客户端?
2条答案
按热度按时间eufgjt7s1#
这个问题是由于WSDL的解析不正确。在wasabi gem中,lib/parser.rb第136行,当前的XPATH搜索是:
然而,我所指的WSDL有不同的元素组织,我不得不调整上面的行:
以下是github中相同问题的链接:https://github.com/savonrb/savon/issues/702
xe55xuns2#
您检索wsdl操作的过程是完全正确的。我检查了'Soap UI'中的wsdl &它似乎WSDL有一些错误。这就是为什么您没有得到任何操作,因为wsdl没有提供任何定义。