Ruby(2.0)& Savon(2)SOAP客户端-返回空SOAP操作

deyfvvtc  于 2023-04-20  发布在  Ruby
关注(0)|答案(2)|浏览(93)

我正在尝试将我的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客户端?

eufgjt7s

eufgjt7s1#

这个问题是由于WSDL的解析不正确。在wasabi gem中,lib/parser.rb第136行,当前的XPATH搜索是:

wsdl:definitions/wsdl:binding/wsdl:operation', 'wsdl' => WSDL

然而,我所指的WSDL有不同的元素组织,我不得不调整上面的行:

'wsdl:definitions/wsdl:portType/wsdl:operation', 'wsdl' => WSDL

以下是github中相同问题的链接:https://github.com/savonrb/savon/issues/702

xe55xuns

xe55xuns2#

您检索wsdl操作的过程是完全正确的。我检查了'Soap UI'中的wsdl &它似乎WSDL有一些错误。这就是为什么您没有得到任何操作,因为wsdl没有提供任何定义。

Error loading [https://xx.xxxx.xxx/DcRegistration/DCRegistrationService.svc?wsdl=wsdl0]: 
java.io.IOException: Attempted read from closed stream

相关问题