Perl SOAP::WSDL 访问 HTTPS 未经授权错误

问题描述 投票:0回答:4

我正在尝试生成一个 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 已修改。

您能给出任何可能出现问题的提示吗?

perl soap https wsdl
4个回答
0
投票

您可以通过网络浏览器自由访问 WSDL 文件吗? 您网络中的其他人可以毫无问题地访问它吗?

也许托管 WSDL 文件的 Web 服务器需要基本或其他类型的身份验证...


0
投票

如果没有必要,我不建议你使用perl作为Web服务客户端。正如你所知,perl是一种开源语言,虽然它确实支持soap协议,但它的支持似乎不是很标准。起初,它的文档不是很清楚。而且,它的支持有时是有限的。最后,bug总是存在。

所以,如果你必须使用wsdl2perl,你可以使用komodo单步进入代码来找出发生了什么。这正是我以前使用perl作为Web服务客户端时所做的。你知道,在https后面是SSL,所以,如果您的SSL是基于证书授权的,您必须设置您的证书路径和受信任服务器证书列表。您最好使用基于linux的firefox进行测试。据我所知,您可以设置firefox的证书路径和firefox的受信任证书列表。如果firefox可以成功地与您的Web服务服务器通信,那么就可以调试您的perl客户端了。


0
投票

要使用 Perl 和 SOAP 调试情况,请插入 Web 代理,以便您可以准确地看到正在传递的数据以及从服务器返回的响应。我希望您收到 401 未授权,但服务器响应中可能有更多详细信息。

Fiddler http://docs.telerik.com/fiddler 和 Charles proxy https://www.charlesproxy.com/ 都可以做到这一点。


0
投票

您引用的错误消息似乎来自这一行:

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 个字符串:
    1. '主机名:端口'
    2. 领域,由网络服务器给出,但我认为你可以放置任何东西
    3. 用户名
    4. 密码
© www.soinside.com 2019 - 2024. All rights reserved.