Мой ответ будет: не надо.
Савон автоматически создаст для вас конверт. Вы можете передать любой заголовок и тело, как хотите, в виде массивов и хэшей или строк XML. Вы можете манипулировать существующими (по умолчанию) пространствами имен и даже отменять действия ввода. Я не уверен, почему кому-то нужно создавать конверт SOAP в XML-парсере, таком как nokogiri.
Если ваша причина отказа от использования Savon для создания оболочки заключается в том, что ей не хватает какой-то функциональности, которая требуется конечной точке, дайте мне знать, в чем именно заключается проблема. В прошлом мне приходилось вносить довольно значительные изменения в Savon, чтобы удовлетворить определенные API, поэтому есть вероятность, что у меня уже есть патч для вас. И если нет, я, безусловно, могу указать вам правильное направление, чтобы вы могли создать свой собственный патч.
И если вам все еще нужно создать конверт за пределами Savon, я бы порекомендовал вам вообще не использовать Savon и просто отправлять XML через одну из многих замечательных http-библиотек.
EDIT:
Чтобы проиллюстрировать, как использовать заголовки SOAP (и пространства имен), вы можете включить их и тело в метод запроса:
client = Savon::Client.new "http://url.to/wsdl"
response = client.get do |soap|
# Use merge! for namespaces so that you don't overwrite all of the original namespaces (while still retaining the ability to overwrite individual ones)
soap.namespaces.merge!({
"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
"xmlns:xsd" => "http://www.w3.org/2001/XMLSchema"
})
# Use soap.header just like you would soap.body
soap.header = {
# SOAP header hash
}
# soap.body as usual
soap.body = {
# SOAP body hash
}
end