пользовательские заголовки soap4r
-
08-07-2019 - |
Вопрос
Я работал с soap4r и пытался использовать SOAP:: Header:: SimpleHandler, я пытаюсь заставить его помещать пользовательский заголовок в исходящее сообщение, но я не могу понять, как заставить его включать атрибуты, а не в качестве подэлементов:
class ServiceContext < SOAP::Header::SimpleHandler
NAMESPACE = "http://context.core.datamodel.fs.documentum.emc.com/"
def initialize()
super(XSD::QName.new(NAMESPACE, 'ServiceContext'))
XSD::QName.new(nil, "Identities")
end
def on_simple_outbound
username = "username"
password = "password"
docbase = "Test"
return {"Identities" => {"Username" => username, "Password" => password, "Docbase" => docbase}}
end
end
который возвращает:
<n1:ServiceContext xmlns:n1="http://context.core.datamodel.fs.documentum.emc.com/"
env:mustUnderstand="0">
<n1:Identities>
<n1:Username>username</n1:Username>
<n1:Password>password</n1:Password>
<n1:Docbase>Test</n1:Docbase>
</n1:Identities>
</n1:ServiceContext>
что мне нужно, чтобы он вернул, так это следующее:
<ServiceContext xmlns="http://context.core.datamodel.fs.documentum.emc.com/">
<Identities xsi:type="RepositoryIdentity" userName="_USER_" password="_PWD_" repositoryName="_DOCBASE_" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</ServiceContext>
Мы очень ценим любую помощь.
Решение
soap4r не очень симпатичный.Я покопался в rdocs abit, и, похоже, самым простым способом решить вашу проблему было бы иметь on_simple_outbound
верните строковое представление элемента, который вы хотите создать.
так что вместо
return {"Identities" => {"Username" => username, "Password" => password, "Docbase" => docbase}}
попробуй
%Q(<Identities xsi:type="RepositoryIdentity" userName="#{user}" password="#{password}" repositoryName="#{docbase}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>)
используя что-то вроде builder, вы могли бы придать ему более рубиновый оттенок, но попробуйте это.
Другим вариантом было бы исследовать новые библиотеки soap. мыло для рук выглядит интересно.