Perl SOAP :: LITE - 无法验证?
我正在尝试 - 并且失败 - 使用SOAP :: LITE来编写一个简单的测试应用程序来访问HP Service Manager站点。 (我也尝试SOAP :: WSDL,但进一步的阅读让我相信它真的不需要什么,我想做的事情。)Perl SOAP :: LITE - 无法验证?
我是新来的SOAP,新的这些包和新到我想要做的事情,所以我不知道我做错了多少事情,但是我认为我已经将它提炼成几行代码,这些代码对我来说应该是可行的。我认为关键问题在于身份验证,但我也考虑过这可能是我试图通过SOAP调用服务管理器例程的方式。
这里的第一个方法,我发现:
#!/usr/local/perl5/bin/perl
use SOAP::Lite+trace => 'all';
$USER = "working_user_name";
$PASS = "working_password";
sub SOAP::Transport::HTTP::Client::get_basic_credentials {
print "###\n";
print "###\n";
print "### Authenticating...\n";
print "###\n";
print "###\n";
return $USER => $PASS;
}
my $soap = SOAP::Lite->new(proxy => 'http://<hp_service_manager>:13080/SM/7/ws');
$soap->default_ns('http://schemas.hp.com/SM/7');
my $som = $soap->call('RetrieveList');
die $som->faultstring if ($som->fault);
print $som->result, "\n";
而且LWP方法我试过:
#!/usr/local/perl5/bin/perl
use SOAP::Lite+trace => 'all';
use LWP::UserAgent;
use LWP::Debug;
LWP::Debug::level('+');
$USER = "working_user_name";
$PASS = "working_password";
my @ua_args = (keep_alive => 1);
my @credentials = ($SERVICE_NS, "", $USER, $PASS);
my $schema_ua = LWP::UserAgent->new(@ua_args);
$schema_ua->credentials(@credentials);
my $soap = SOAP::Lite->new(proxy => 'http://<hp_service_manager>:13080/SM/7/ws', @ua_args, credentials => \@credentials);
$soap->default_ns('http://schemas.hp.com/SM/7');
my $som = $soap->call('RetrieveList');
die $som->faultstring if ($som->fault);
print $som->result, "\n";
的问题是,无论我做什么,我得到一个“未授权”的回报。这是一个HP Service Manager安装。我将为我想要做的事提供WSDL条目。我怀疑它是有用的。
<soap:operation soapAction="RetrieveList" style="document"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
虽然有就是这个来自多了很多,这是有关的输出,我相信:
SOAP::Transport::HTTP::Client::send_receive: HTTP::Request=HASH(0x845c630)
SOAP::Transport::HTTP::Client::send_receive: POST http://<service_manager>:13080/SM/7/ws HTTP/1.1
Accept: text/xml
Accept: multipart/*
Content-Length: 488
Content-Type: text/xml; charset=utf-8
SOAPAction: "#default_ns"
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><default_ns><c-gensym3 xsi:type="xsd:string">http://schemas.hp.com/SM/7</c-gensym3></default_ns></SOAP-ENV:Body></SOAP-ENV:Envelope>
SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH(0x8597238)
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 401 Unauthorized
Connection: close
Date: Fri, 15 Feb 2013 19:42:06 GMT
Server: Apache-Coyote/1.1
WWW-Authenticate: Basic realm="CASM"
Content-Length: 40
Content-Type: text/html;charset=utf-8
Client-Date: Fri, 15 Feb 2013 19:42:07 GMT
Client-Peer: nnn.nn.nn.nn:13080
Client-Response-Num: 1
<HTML><BODY>Not Authorized</BODY></HTML>
谁能帮助?我已经尝试了几乎所有我能够找到的示例,然后尝试了这些示例的变体,并且我从未设法获得任何进一步信息。在任何情况下,我都会收到“未经授权”的退货。
谢谢,
肖恩。
不要被误导:SOAP ::精简版的调试输出不显示认证头(出于某种原因?)。
的“重写get_basic_credentials” -method全局设置的用户名/密码,而不管域和领域的。这实际上是一件坏事......
这(测试)的代码应该解决您的问题:
#!/usr/local/perl5/bin/perl -w
use strict;
use SOAP::Lite+trace => 'all';
my $soap = SOAP::Lite->new('proxy' => [
'http://<yourdomain>:<yourport>/<yourpath>',
'credentials' => [
"<yourdomain>:<yourport>",
"<yourrealm>",
"<yourusername>",
"<yourpassword>"
]
]);
my $som = $soap->RetrieveList();
die $som->faultstring if ($som->fault);
print $som->result, "\n";
其中“<yourrealm>
”应设置为“CASM”,“<yourpath>
”应设置到“/ SM/7/ws”,“<yourport>
”应设置为“13080”。
旧回复:尝试做这样的代替(注意额外的星号):
*SOAP::Transport::HTTP::Client::get_basic_credentials = sub {
return ($USER, $PASS);
}
还是这个答案吗? Adding authHeader to Perl SOAP::Lite request
# create header for requests
my $authHeader = SOAP::Header->name("xsd:authHeader" =>
\SOAP::Header->value(
SOAP::Header->name('xsd:user')->value($s7user)->type(''),
SOAP::Header->name('xsd:password')->value($s7pass)->type(''),
SOAP::Header->name('xsd:appName')->value('TestApp')->type(''),
SOAP::Header->name('xsd:appVersion')->value('0.03')->type('')
));
# create data to pass as method paramaters
my $params = SOAP::Data->name('ns:email')->value($s7user)->type('');
# request method
$soap->call('checkLogin', $params, $authHeader);
这里也没有运气。至于指南,是的,我找到了它,并试图在其中使用各种方法。我所能找到的有关HP Service Manager的一切都是我需要使用基本身份验证。我已经尝试了该指南中的三种方法,但都没有工作。我也尝试过其他一些,但没有喜乐。 – Sean 2013-02-18 15:38:44
什么是Perl和Soap模块版本?他们是最新的吗? 您是否有其他可以连接到此服务的工具?如果是的话,你可以'嗅'两者之间的沟通,看看你的解决方案有什么不同。不要放弃,它会起作用! – user1126070 2013-02-19 09:22:42
你找到了吗? http://www.ifost.org.au/Training/ServiceManager/webperl-coursenotes.pdf – user1126070 2013-02-19 09:25:06
你能成功地验证手动使用了SoapUI?每当我在处理SOAP/WSDL时都有疑问时,我会使用[SoapUI](http://www.soapui.org/About-SoapUI/what-is-soapui.html)。 – slayedbylucifer 2013-02-18 13:37:20