我正在尝试生成一个Perl库来连接到WebService。此Web服务位于HTTPS服务器中,我的用户可以访问它。
我已经多次使用不同的选项执行了wsdl2perl.pl,但它总是失败并显示以下消息:Unauthorized at /usr/lib/perl5/site_perl/5.8.8/SOAP/WSDL/Expat/Base.pm line 73.
问题是,当我不将我的用户/传递作为参数时,它甚至不会要求它们。
我读过[SOAP :: WSDL :: Manual :: Cookbook](http://search.cpan.org/~mkutter/SOAP-WSDL-2.00.10/lib/SOAP/WSDL/Manual/Cookbook .pod)并完成了关于HTTPS的说法:Crypt :: SSLeay是instaleld,SOAP :: WSDL :: Transport :: HTTP和SOAP :: Transport :: HTTP都被修改。
你能否提出任何可能出错的提示?
答案 0 :(得分:0)
您可以从Web浏览器自由访问WSDL文件吗? 你网络中的其他人可以毫无问题地访问它吗?
托管WSDL文件的Web服务器可能需要Basic或其他类型的身份验证...
答案 1 :(得分:0)
如果没有必要,我不建议您使用perl作为Web服务客户端。如您所知,perl是一种开源语言,虽然它支持soap协议,但它的支持似乎不是很标准。起初,它的文档不是很清楚。而且,它的支持有时是有限的。最后,bug总是存在。
所以,如果你必须使用wsdl2perl,你可以使用komodo进入代码来找出发生了什么。这就是我以前用perl作为web服务客户端时所做的事情。你知道,在后面https是SSL,因此,如果您的SSL基于证书授权,您必须设置您的证书路径和可信服务器证书列表。您最好使用基于Linux的Firefox来进行测试。我知道,你可以设置firefox的cert路径和firefox的可信证书列表。如果firefox可以成功地与你的web服务器通信,那么,是时候调试你的perl客户端了。
答案 2 :(得分:0)
要使用Perl和SOAP调试情境,请插入Web代理,以便您可以准确地查看正在传递的数据以及从服务器返回的响应。我期待你获得401未授权,但服务器响应中可能有更多细节。
Fiddler http://docs.telerik.com/fiddler和Charles代理https://www.charlesproxy.com/都可以做到这一点。
答案 3 :(得分:0)
您引用的错误消息似乎来自以下行:
die $response->message() if $response->code() ne '200';
在HTTP世界中,Unauthorized
显然是错误代码401,这意味着您的网站要求输入用户名和密码(最有可能的是,某些网站可能会“劫持”此错误代码以满足其他条件,例如来源上的过滤器IP)。
你有他们吗?
如果是这样,你可以
wdsl2perl
后,在创建的文件中找到调用set_proxy()
的位置并更改其中的网址,以包含用户名和密码:...->set_proxy('http://USERNAME:PASSWORD@www.example.com/...')
SOAP::WSDL
对象后,在其上调用service(SERVICENAME)
(对于您在WSDL文件中定义的每个服务),这将为您提供一个新对象,您可以在其上调用transport()
访问基础传输对象,您可以使用上面格式化的网址调用proxy()
(是的,此处为proxy()
,上方为set_proxy()
);或者您拨打credentials()
而不是proxy()
并传递4个字符串: