0

我正在使用 Builder 来构造发送到 WebService 的 XML 消息。每种不同的方法都需要不同的 xml,但它们都有一组共同的元素来开始请求(主要是帐户身份验证的东西)。有没有办法以干燥的方式做到这一点?这是我构建更改密码短语请求的代码:

# XML REQUEST SETUP
msg = Builder::XmlMarkup.new(:indent=>2)
query = {}
test_hsh = self.testmode ? {:Test => "YES"} : {}

# BUILD THE REQUEST
query[:changePassPhraseRequestXML] = msg.ChangePassPhraseRequest(test_hsh) do |asr|
  asr.RequesterID APP_CONFIG[:endicia_partner_id].to_s
  asr.RequestID "1"
  asr.CertifiedIntermediary do |ci|
    ci.AccountID APP_CONFIG[:endicia_account_number].to_s
    ci.PassPhrase APP_CONFIG[:endicia_passphrase].to_s
  end
  asr.NewPassPhrase APP_CONFIG[:passphrase].to_s
end

基本上除了 NewPassPhrase 之外的所有元素对所有(或大多数)请求都是通用的。现在我一遍又一遍地复制相同的代码,但我根本不喜欢这个。

有什么想法可以把它弄干吗?

4

1 回答 1

0

我一发布这个。我灵机一动,把第一套变成自己的方法。呸!

def account_status(options = {})
  # XML REQUEST SETUP
  msg = Builder::XmlMarkup.new(:indent=>2)
  query = {}
  test_hsh = self.testmode ? {:Test => "YES"} : {}

  # BUILD THE REQUEST
  query[:changePassPhraseRequestXML] = msg.ChangePassPhraseRequest(test_hsh) do |asr|
    self.add_authentication_elements(asr)
    asr.NewPassPhrase APP_CONFIG[:new_pass_phrase].to_s
  end
end

def add_authentication_elements(parent_node)
  parent_node.RequesterID self.endicia_partner_id.to_s
  parent_node.RequestID "1"
  parent_node.CertifiedIntermediary do |ci|
    ci.AccountID self.endicia_account_number.to_s
    ci.PassPhrase self.endicia_passphrase.to_s
  end
end

效果很好!当然,另一种选择是以某种方式扩展 Builder,但这既好又简单。

于 2010-10-13T15:00:24.323 回答