Web services Elixir调用Axis2 Java SOAP Web服务,使用洗涤剂Ex和洗涤剂

Web services Elixir调用Axis2 Java SOAP Web服务,使用洗涤剂Ex和洗涤剂,web-services,soap,wsdl,erlang,elixir,Web Services,Soap,Wsdl,Erlang,Elixir,在Elixir中,我尝试使用调用SOAP Web服务,它是Erlang库的包装器 我可以在洗涤剂主页上调用示例中的SOAP Web服务,没有问题: 参数: wsdl_url = "http://www.webservicex.net/convertVolume.asmx?WSDL" action = "ChangeVolumeUnit" parameters = ["100","dry","centiliter"] 然而,当尝试调用Axis2 Java SOAP Web服务时,我遇到了一些问题

在Elixir中,我尝试使用调用SOAP Web服务,它是Erlang库的包装器

我可以在洗涤剂主页上调用示例中的SOAP Web服务,没有问题:

参数:

wsdl_url = "http://www.webservicex.net/convertVolume.asmx?WSDL"
action = "ChangeVolumeUnit"
parameters = ["100","dry","centiliter"]
然而,当尝试调用Axis2 Java SOAP Web服务时,我遇到了一些问题。例如:

按以下方式调用“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

关于我做错了什么有什么建议吗?

根据实现,在
init\u模型上添加了前缀

def init_model(wsdl_url, prefix \\ 'p') do
   Detergentex.Client.init_model(wsdl_url, prefix)
end
我建议添加一个空前缀。

此代码

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

 def wsdl_operations(wsdl), do: :detergent.wsdl_operations(wsdl)
在directgentex/lib/directgentex/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

因此,我想这一次似乎是编码有问题。

谢谢你的建议。尽管如此,我尝试将代码从
wsdl=directonex.init_模型(wsdl_url)
更改为
wsdl=directonex.init_模型(wsdl_url.)
,但仍然收到相同的错误消息。您使用的库的版本是什么?我使用的是directonex版本0.0.7(最新的十六进制版本,截至今天)似乎这可能是
erlsom
解析中的一个已知问题:我在抓救命稻草,但将:
action=“getBank”
更改为
action=“tns:getBank”
帮助?不,在
操作中删除
tns:
没有帮助。返回了一个错误:
{:error,'operation not found'}
我试图更改此设置并重新编译洗涤剂,但似乎没有什么不同。我仍然收到相同的错误消息
Struct与model:recordtype不匹配:p:getBank
知道区别是什么吗?(对我来说,这两个版本似乎做了完全相同的事情,尽管我绝不是长生不老药专家)这些代码替换似乎是相同的。Elixir在内部将所有内容编译成
do:
格式。