我正在尝试使用Erlang和YAWS(特别是yaws_soap_lib模块)通过SOAP调用WebService。 http://yaws.hyber.org/soap_intro.yaws上发布的示例对我有用。
但是,当尝试调用我自己的Web服务时,YAWS失败。第一个问题是WSDL中的合作伙伴链接,因为BPEL正在寻找此服务。我删除了它们(暂时)。
不幸的是,我遇到了另一个问题:提到WSDL有一个空的< types>标签。现在,我对WSDL规范和SOAP不太熟悉,所以我的问题是它是否是
有没有人知道更好的Erlang库来处理SOAP?我看了一下erlsoap,但它不支持WSDL。
编辑:由提到的WSDL引起的错误:
::error:function_clause
in function erlsom_add:add_model/2
called as add_model({model,[{type,'_document',sequence,
[{el,[{alt,'soap:Envelope','soap:Envelope',...},
{alt,'soap:Header',...},
{alt,...},
{...}],
1,1,1}],
[],undefined,undefined,1,1,1,false,...},
{type,'soap:detail',sequence,
[{el,[{alt,'#any',...},{alt,...},{...}|...],0,unbound,1}],
[],
{anyAttr,"lax","##any",[...]},
undefined,2,1,1,...},
{type,'soap:Fault',sequence,
[{el,[{alt,...}],1,1,...},
{el,[{...}],1,...},
{el,[...],...},
{el,...}],
[],undefined,undefined,5,1,...},
{type,'soap:Body',sequence,
[{el,[{...}|...],0,...}],
[],
{anyAttr,[...],...},
undefined,2,...},
{type,'soap:Header',sequence,
[{el,[...],...}],
[],
{anyAttr,...},
undefined,...},
{type,'soap:Envelope',sequence,[{el,...},{...}|...],[],{...},...}],
[{ns,"http://schemas.xmlsoap.org/soap/envelope/","soap"},
{ns,"http://www.w3.org/2001/XMLSchema","xsd"}],
"http://schemas.xmlsoap.org/soap/envelope/",[]},undefined)
in call from yaws_soap_lib:initModel2/5
对于那些熟悉源代码的人:问题是getXsdsFromWsdl函数返回的Xsds数组是空的。
答案 0 :(得分:0)
我的XML模式有点生疏,但据我所知the schema允许空<types/>
元素。这将是第一种选择,尽管很难确定。您收到了什么错误消息?
答案 1 :(得分:0)
我想如果函数子句错误,那么erlsom没有将某些特定的函数输入处理为未定义。但是我假设你已经验证了你的WSDL以确保它没问题?还有,任何机会在某处发布WSDL,以便我们可以看到它吗?
答案 2 :(得分:0)
该问题已在最新的YAWS版本中得到解决。为了构造所提到的WSDL模型,必须调用以下命令:
yaws_soap_lib:initModel(WSDL_FILE_URL, [{include_fun, {erlsom_lib, find_xsd}}])