【问题标题】:constructing request data for SOAP endpoint without WSDL为没有 WSDL 的 SOAP 端点构造请求数据
【发布时间】:2019-10-10 02:29:14
【问题描述】:

端点 URL 如下所示(不是实际 URL) https://webservices.abcde.com/ThirdParty/PostData.V55.ashx/ProcessRequest

它没有 WSDL,并且在文档中,有一个示例请求 XML。

这是巨大的。我在下面添加前几行。

<MESSAGE xmlns:agentnet="http://services.abcde.com/entity/agentnet/v2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.mismo.org/residential/2009/schemas/v32">
<ABOUT_VERSIONS>
  <ABOUT_VERSION>
    <AboutVersionIdentifier>ClientSystem</AboutVersionIdentifier>
    <DataVersionIdentifier>1.0</DataVersionIdentifier>
    <DataVersionName>ASDFSFD</DataVersionName>
  </ABOUT_VERSION>
</ABOUT_VERSIONS>
<DEAL_SETS>
  <DEAL_SET>
        <DEALS>
          <DEAL>
            <PARTIES/>
            <SERVICES>
              <SERVICE>
                <SERVICE_PRODUCT>
                  <SERVICE_PRODUCT_REQUEST>
                    <EXTENSION>
                      <OTHER>
                        <agentnet:AGENTNET_PRODUCT_REQUEST>
<agentnet:AgentNetServiceType>GET_DATA</agentnet:AgentNetServiceType>
                          <agentnet:AGENTNET_GET_DATA>
                            <agentnet:GetRequestType>ACCOUNTS</agentnet:GetRequestType>
                          </agentnet:AGENTNET_GET_DATA>
                        </agentnet:AGENTNET_PRODUCT_REQUEST>
...
...
...
...
... (the XML is huge)

借助其他端点,我能够使用像 savon 这样的 SOAP 库,使用小型 Rub​​y 哈希(字典)生成 XML 有效负载。

我认为这是可能的,因为那些是 WSDL?

是否可以通过仅传递一些基本数据(例如,GET_DATAACCOUNTS 在示例中)以相同的方式生成有效负载,或者我应该手动构建 XML 有效负载字符串(可能使用一些XML 库)?

我真的想避免手动构建 XML 有效负载,因为代码将不可读并且通常难以使​​用。有办法避免吗?

【问题讨论】:

    标签: soap wsdl savon


    【解决方案1】:

    您可以在不使用 WSDL 的情况下明确地创建 Savon 客户端。我个人更喜欢这个,因为我相信它的性能更高。

    您必须在创建客户端时定义endpointnamespace,就像这个虚构的例子:

    require 'savon'
    
    c = Savon.client(endpoint: "http://www.example.com",
                     namespace: "urn:ns.example.com",
                     log: true,
                     log_level: :debug,
                     pretty_print_xml: true)
    
    r = c.call(:call,
               :message => { 
                      :InquiryParam => [ 
                             {"crmParam" => 123,
                            :attributes! => { "crmParam" => { "name" => "AccountNumber" }}},
                             {"crmParam" => 456,
                            :attributes! => { "crmParam" => { "name" => "history" }}}
                            ]
                      }
              )
    

    【讨论】:

    • 我知道我可以创建一个没有 WSDL 的 Savon 客户端。但是,当我尝试生成带有小散列的有效负载时,它只是将散列转换为 XML,在我的示例中它没有生成 DEAL_SETSDEALSPARTIES。我需要手动创建这些节点吗?我不是 SOAP 专家,但我认为有关 XML 有效负载的字段和结构的信息来自 WSDL。
    • 是的,您必须根据需要创建整个结构作为哈希。 Savon 会将散列转换为有效负载的正确 XML。
    • Savon 在这种情况下有用吗?我认为只有当它可以通过 WSDL 或其他东西了解 XML 的结构时它才有用。另外,在我的情况下,构建 XML 有效负载的最佳方法是什么?我正在考虑使用像 ERB 这样的模板语言来模板化并生成 XML。
    • 我一直认为发送逐字 XML 作为最后的手段。如果您可以使用标准 Ruby 对象构建您的客户端,那么 Savon 将为您完成这项工作。但是有很多方法可以给猫剥皮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2014-05-22
    相关资源
    最近更新 更多