【问题标题】:Accessing the request body of a SOAP request with Savon (Ruby on Rails)使用 Savon (Ruby on Rails) 访问 SOAP 请求的请求正文
【发布时间】:2012-05-16 13:13:33
【问题描述】:

我在 Ruby on Rails 中使用 Savon gem 与 wsdl WS 进行通信。一切正常,但我想使用自定义日志记录请求 XML,即不是 Rails 或 Savon 记录器。我的代码如下所示:

    response = self.client.request :add_order do
      soap.body = { 
        :indata => {
          "CustomerNo" => config[:kundnr],
          "Pwd" => config[:password],
          "OrderDate" => order["purchase_order_date"].strftime('%Y%m%d')
        }
      }
    end

访问响应没有问题,但是请求呢?我需要能够通过将 XML 记录到 DB 字段来查看生产环境中发送的内容。

【问题讨论】:

    标签: ruby-on-rails ruby soap wsdl savon


    【解决方案1】:

    目前没有简单的方法来获取请求 XML。但正如您所注意到的,Savon logs each request and response 指向指定的记录器。因此,如果您不更改日志级别,则可以使用自定义类似 Logger 的对象来响应 :debug 并存储记录的内容。

    module DBLogger
      def self.debug(message)
        p message  # replace with custom impl.
      end
    end
    
    Savon.configure do |config|
      config.logger = DBLogger
    end
    

    希望有帮助!

    【讨论】:

    • 感谢您的回复,我会尝试这种方法并返回!
    • 工作就像一个魅力!或者无论如何 :) 我最终在我自己的记录器中覆盖了调试,用 Nokogiri 解析消息并将相关信息记录在我自己的数据库字段中。感谢 rubiii 的帮助。
    • 这很酷,谢谢,但你需要我添加“信息”方法,如“调试”
    • 只是一个快速更新。通过告诉 Savon.client 来定义记录器现在变得更加容易:savonrb.com/version2/globals.html (-> Logging)
    【解决方案2】:

    官方答案中没有明确说明这一点,但我必须提供更多选项才能让请求/响应正确记录。就我而言,我只是使用Rails.logger 而不是自己滚动:

    client = Savon.client(
      wsdl: 'http://example.com?wsdl',
      log: true,
      logger: Rails.logger,
      log_level: :debug
    )
    
    client.call(:example_operation, message: {example: 'example'})
    

    log_level 可能会默认调试,但明确表示没有害处 :) 但是如果没有 log: true 选项,您将看不到实际的请求/响应正文,只能看到 url 和状态。

    我使用的是 Savon 2.7.2 作为参考。

    【讨论】:

    • 有什么方法可以在全局配置中设置 Savon 日志记录? (适用于 savon 2)
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多