Rails Builder::XmlMarkup для веб-службы - повторяющийся раздел
Я использую 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 ответ
Как только я разместил это. У меня была идея, поставить первый набор в свой метод. Duh!
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, но это приятно и просто.