我正在尝试生成一个 Perl 库来连接到 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 并完成了有关 HTTPS 的操作:Crypt::SSLeay 已安装,并且 SOAP::WSDL::Transport::HTTP 和 SOAP::Transport: :HTTP 已修改。
您能给出任何可能出现问题的提示吗?
您可以通过网络浏览器自由访问 WSDL 文件吗? 您网络中的其他人可以毫无问题地访问它吗?
也许托管 WSDL 文件的 Web 服务器需要基本或其他类型的身份验证...
如果没有必要,我不建议你使用perl作为Web服务客户端。正如你所知,perl是一种开源语言,虽然它确实支持soap协议,但它的支持似乎不是很标准。起初,它的文档不是很清楚。而且,它的支持有时是有限的。最后,bug总是存在。
所以,如果你必须使用wsdl2perl,你可以使用komodo单步进入代码来找出发生了什么。这正是我以前使用perl作为Web服务客户端时所做的。你知道,在https后面是SSL,所以,如果您的SSL是基于证书授权的,您必须设置您的证书路径和受信任服务器证书列表。您最好使用基于linux的firefox进行测试。据我所知,您可以设置firefox的证书路径和firefox的受信任证书列表。如果firefox可以成功地与您的Web服务服务器通信,那么就可以调试您的perl客户端了。
要使用 Perl 和 SOAP 调试情况,请插入 Web 代理,以便您可以准确地看到正在传递的数据以及从服务器返回的响应。我希望您收到 401 未授权,但服务器响应中可能有更多详细信息。
Fiddler http://docs.telerik.com/fiddler 和 Charles proxy https://www.charlesproxy.com/ 都可以做到这一点。
您引用的错误消息似乎来自这一行:
die $response->message() if $response->code() ne '200';
在 HTTP 世界中,Unauthorized
显然是错误代码 401,这意味着您的网站要求输入用户名和密码(最有可能的是,某些网站可能“劫持”此错误代码以满足其他条件,例如源 IP 上的过滤器) 。
你有吗?
如果是的话,你可以
wdsl2perl
后,在创建的文件中找到调用 set_proxy()
的位置,并更改其中的 URL 以包含用户名和密码,如下所示:...->set_proxy('http://USERNAME:[email protected]/...')
SOAP::WSDL
对象后,对其调用 service(SERVICENAME)
(对于您在 WSDL 文件中定义的每个服务),这会为您提供一个新对象,您可以在该对象上调用 transport()
来访问底层传输对象,您可以使用上面格式的 URL 调用 proxy()
(是的,这里是 proxy()
,上面是 set_proxy()
);或者你调用 credentials()
而不是 proxy()
并传递 4 个字符串: