Rails Builder :: XmlMarkup для веб-службы - повторяющийся раздел - PullRequest
0 голосов
/ 13 октября 2010

Я использую Builder для создания 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, являются общими для всех (или большинства) запросов. Сейчас я копирую один и тот же код снова и снова, но мне это совсем не нравится.

Какие-нибудь идеи по поводу сушки?

1 Ответ

0 голосов
/ 13 октября 2010

Как только я это опубликовал.У меня была идея, поставить первый набор в свой метод.Дух!

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, но это приятно и просто.

...