Ruby - SOAP WSDL - Savon Gem。发送请求未发送某些数据时出错

时间:2016-12-23 13:34:42

标签: ruby wsdl savon

我使用Savon gem和Ruby将请求发布到wsdl webservice。问题是,当我发送请求时,响应显示响应没问题,但是我在请求中发送了一个项目,在开发团队的帮助下,我可以看到webservice得到没有项目的请求,所以我可以认为我对请求格式或数据做错了。因为我使用Savon 2 stable我无法看到请求xml Savon直接发送

该项目是最后一项," promotion_rules"之一。

    @result = @client.call(
        :create_template, message: {
            :item => [{
                'promotion_id'          => 1,
                'initial_quantity'      => 0,
                :products => [{
                    :product => {
                        'id'                    => 3,
                        'quantity'              => 1
                    }
                }],
                :lists => [{
                    :list => [
                        0,
                        1,
                        2
                    ]
                }],
                :promotion_rules => [{
                    :promotion_rule => {
                        'code'      => "NEW_USER",
                        'value'     => 1
                    }
                }]
            }]
        }
    )

我得到的回应是:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ws.test.enterprise.com">
  <SOAP-ENV:Body>
    <ns1:createTemplateResponse>
      <item>
        <response>
          <code>000</code>
          <description>Aprobada</description>
          <ticket>99999999</ticket>
        </response>
        <attention>
          <begin>2016-12-23 10:49:50</begin>
          <end>2016-12-23 10:49:50</end>
          <time>0.2</time>
        </attention>
        <template_id>901</template_id>
      </item>
    </ns1:createTemplateResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

该项目所需的具体数据如下:

<xsd:element name="promotion_rules" maxOccurs="1" minOccurs="0">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="promotion_rule" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="code" type="xsd:string"/>
            <xsd:element name="value" type="xsd:integer"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果没有wsdl文件或至少wsdl文件中的完整类型定义(例如Item),则无法检查有效负载的正确性。

根据你的调试输出问题:你检查过savon的调试输出吗? Savon可以使用以下配置将您的请求和响应xml有效负载打印到控制台:

Rails.logger = Logger.new(STDOUT)
Rails.logger.level = LOGGER::DEBUG

那么你的savon配置应该包括

savon_config = {
  ...
  log: true,
  logger: Rails.logger,
  ...
}

也许这会帮助您调试请求 - 有效负载?

答案 1 :(得分:0)

在指定的数组和元素的方式中发现了问题,而不是:element应该是'element':

                'promotion_rules' => [{
                    'promotion_rule' => {
                        'code'       => "NEW_USER_RULE",
                        'value'      => 1
                    }
                }]

而不是:

                :promotion_rules => [{
                    :promotion_rule => {
                        'code'      => "NEW_USER_RULE",
                        'value'     => 1
                    }
                }]