Эликсир называют Axis2 Java SOAP Web Service с моющим средством и детергентом

Из Elixir, я пытаюсь вызвать веб-службу SOAP с detergentex, которая является оберткой вокруг библиотеки Erlang detergent.

Я могу вызвать веб-службу SOAP в примере на домашней странице моющего средства без проблем: http://www.webservicex.net/convertVolume.asmx?WSDL

Параметры:

wsdl_url = "http://www.webservicex.net/convertVolume.asmx?WSDL"
action = "ChangeVolumeUnit"
parameters = ["100","dry","centiliter"]

Однако при попытке вызвать веб-службу Java SOAP Axis2 у меня возникают некоторые проблемы. Пример: http://www.thomas-bayer.com/axis2/services/BLZService?wsdl

При вызове "getBank" следующим образом

wsdl_url = "http://www.thomas-bayer.com/axis2/services/BLZService?wsdl"
action = "getBank"
parameters = ["abc"]
wsdl = Detergentex.init_model(wsdl_url)
res = Detergentex.call(wsdl, action, parameters)

Появляется следующее сообщение об ошибке:

{:error, 'Struct doesn\'t match model: recordtype not expected: p:getBank'}

со следующей трассировкой стека

    src/erlsom_write.erl:357: :erlsom_write.findAlternative/4
    src/erlsom_write.erl:258: :erlsom_write.processSubType/5
    src/erlsom_write.erl:241: :erlsom_write.processElementValues/7
    src/erlsom_write.erl:132: :erlsom_write.struct2xml/6
    src/erlsom_write.erl:323: :erlsom_write.processAlternativeValue/8
    src/erlsom_write.erl:241: :erlsom_write.processElementValues/7
    src/erlsom_write.erl:116: :erlsom_write.struct2xml/6
    src/erlsom_write.erl:323: :erlsom_write.processAlternativeValue/8
    src/erlsom_write.erl:241: :erlsom_write.processElementValues/7
    src/erlsom_write.erl:45: :erlsom_write.write/2
    src/detergent.erl:211: :detergent.call_attach/8

Любые предложения относительно того, что я делаю неправильно?

Ответ 1

В соответствии с реализацией префикс добавляется в init_model.

def init_model(wsdl_url, prefix \\ 'p') do
   Detergentex.Client.init_model(wsdl_url, prefix)
end

Я бы предложил добавить пустой префикс.

Ответ 2

Этот код

 def is_wsdl(wsdl), do: :detergent.is_wsdl(wsdl)

 def wsdl_operations(wsdl), do: :detergent.wsdl_operations(wsdl)

в detergentex/lib/detergentex/client.ex следует заменить на

 def is_wsdl(wsdl) do 
   :detergent.is_wsdl(wsdl)
 end

 def wsdl_operations(wsdl) do 
   :detergent.wsdl_operations(wsdl)
 end

чтобы избежать ошибки с неправильным префиксом. Я не знаю, что не так, потому что обе версии кажутся законными.

В любом случае ваш код не будет работать - появляется новая ошибка:/

У меня есть разные ошибки с моим кодом для URL:

wsdl_url = 'http://webapi.allegro.pl/service.php?wsdl'

Первый:

** (throw) {:error, 'Struct doesn\'t match model: recordtype not expected: p:doQuerySysStatus'}
src/erlsom_write.erl:366: :erlsom_write.findAlternative/4
src/erlsom_write.erl:256: :erlsom_write.processSubType/5
src/erlsom_write.erl:239: :erlsom_write.processElementValues/7
src/erlsom_write.erl:130: :erlsom_write.struct2xml/6
src/erlsom_write.erl:326: :erlsom_write.processAlternativeValue/8
src/erlsom_write.erl:239: :erlsom_write.processElementValues/7
src/erlsom_write.erl:114: :erlsom_write.struct2xml/6
src/erlsom_write.erl:326: :erlsom_write.processAlternativeValue/8

и после исправления:

** (Protocol.UndefinedError) protocol String.Chars not implemented for {:ok, :undefined, :undefined}
(elixir) lib/string/chars.ex:3: String.Chars.impl_for!/1
(elixir) lib/string/chars.ex:17: String.Chars.to_string/1
(elixir) lib/io.ex:429: IO.puts/2

На этот раз похоже, что с кодировкой я ошибаюсь.