2015-10-02 3 views
0

Я в настоящее время строит клиент SOAP в Ruby, используя Савон, но когда я пишу код для генерации XML, мне приходится писать:Savon - ярлык для добавления каждого элемента с пространством имен? (SOAP)

builder = Builder::XmlMarkup.new 
builder.ns :request do 
    builder.ns :Foo do 
     builder.ns :FooBar do 
      builder.ns :Bar, "Foo" 
     end 
    end 
end 

генерировать

<ns:request> 
<ns:Foo> 
<ns:FooBar> 
<ns:Bar>Foo</ns:Bar> 
</ns:FooBar> 
</ns:Foo> 
</ns:request> 

Это, очевидно, довольно повторяющийся, и, если возможно, я хотел бы вырезать повторы NS. Я также заметил, что без ns мне разрешено использовать фигурные скобки, а не dos/end.

Есть ли способ обойти это? Мне не нравится, что у меня нет возможности использовать фигурные скобки, и когда я добавлю динамический ввод имен элементов позже, это может усложнить ситуацию.

Я попытался

def send_builder(requestsym, data=nil) 
@@builder requestsym, data 
end 

Но мое знание блоков/проки/лямбды не достаточно хорошо, чтобы сделать эту работу с вложенными элементами.

+0

Пожалуйста, скажите мне что-нибудь, вы пытаетесь правильно построить XML своего запроса? – SsouLlesS

ответ

1

Я думаю, что это то, что вам нужно, так что вы хотите, чтобы предварять пространство имен в XML-запроса права ?:

С Савоном вы можете добавить пространство имен для вашего запроса XML следующим образом

client = Savon.client do 
    wsdl: "http://www.webserviceurl.net/service.asmx?WSDL" 
    namespace_identifier: :ns 
end 
response = client.call(:yourOperationHere, message: { request: { foo: { foo_bar: { bar: "Foo" } } } }) 

результат будет (тело вашего запроса):

<ns:request> 
    <ns:foo> 
    <ns:fooBar> 
     <ns:bar> 
     Foo 
     </ns:bar> 
    </ns:fooBar> 
    </ns:foo> 
</ns:request> 

так же, как примечание для вас, Savon есть нечто, называемое Gyoku, он преобразует символы в: верблюжий, поэтому, если ваш запрос случай Чувствительные строки использования вместо символов.

+0

Привет, звучит неплохо, но я не уверен, что я что-то прикручу. Когда я пытаюсь этот код, я получаю 'NoMethodError: неопределенный метод«запрос»для # <Савон :: Клиент: 0x007f3e82fb8840> из (PRY): 1: в«

»' – Joe

+0

кажется, что-то не так с вашим клиентом , что происходит, когда вы выполняете 'client.wsdl.soap_actions'? Убедитесь, что URL-адрес вашего запроса верен, URL-адрес, который я вам дал в ответе, является всего лишь примером – SsouLlesS

+0

Привет, я получаю NoMethodError: undefined method 'wsdl 'для # Joe