我正在尝试使用需要凭据的Web服务中的方法 遗憾的是,未指定如何传递这些凭据(用户名和密码)。
我在PHP中有一个用于执行该方法的工作示例(getEmpresas()aka getProviders()), 期望凭证作为关联数组(参见下面的代码)。
我正在实现与Perl中的web服务的交互(我公司的要求) 我需要在我身边生成XML。然后我使用SoapUI来找出请求XML格式, 但是如果你去看看SoapUI中的方法,则缺少对应于凭证的部分。 然而,通过在我管理的PHP示例中调用getEmpresas()之后执行getLastRequest() 获取请求的XML(见下文)。坏消息是,如果我复制/粘贴请求XML I 在SoapUI中获取,该方法不起作用,我收到错误'Err。:凭证无效。'
我也尝试过使用Perl库SOAP :: Lite(下面的代码),但结果是一样的:'Err。:凭证无效。'
我完全陷入困境,来自网络服务的支持人员无法帮助我,因为他没有 开发它,我认为它不知道它是如何工作的。
我在SoapUI中使用Authentication Basic,通过包含凭据,但我仍然没有得到任何结果。
我想我已经完成了我的作业:)但经过这么多不同的尝试后,我很沮丧,不知道还能做什么。 我不是网络服务方面的专家,所以我真的很感激这方面的一些建议。
提前致以最诚挚的问候和谢意,
MAAT
PS:我在http://stackoverflow.com和其他地方搜索了几个主题,虽然我发现了类似的帖子 他们都没有给我一个解决方案的暗示。 很抱歉这篇长篇文章,我希望包含所有细节,除了webservice的位置,我可以提供。
从SoapUI请求XML
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="https://www.XYZ.cl/ws/webservice/soapdist">
<soapenv:Header/>
<soapenv:Body>
<soap:getEmpresas soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<credenciales xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<item>
<key xsi:type="xsd:string">username</key>
<value xsi:type="xsd:string">test</value>
</item>
<item>
<key xsi:type="xsd:string">password</key>
<value xsi:type="xsd:string">prueba</value>
</item>
</credenciales>
</soap:getEmpresas>
</soapenv:Body>
</soapenv:Envelope>
响应XML
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://www.XYZ.cl/ws/webservice/soapdist" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getEmpresasResponse>
<return xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">code</key>
<value xsi:type="xsd:int">0</value>
</item>
<item>
<key xsi:type="xsd:string">msg</key>
<value xsi:type="xsd:string">Err.: Invalid credentials.</value>
</item>
</return>
</ns1:getEmpresasResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
注意:
在加载方法时,SoapUI中显示的XML完全缺少<credenciales> ... </credenciales>
中显示的数组,而是显示:<!--You may enter ANY elements at this point-->
我还在凭证部分尝试了(不成功)以下3个:
1)
<item><username xsi:type="xsd:string">test</username></item>
<item><password xsi:type="xsd:string">prueba</password></item>
2)
<item>
<username xsi:type="xsd:string">test</username>
<password xsi:type="xsd:string">prueba</password>
</item>
3)
<username xsi:type="xsd:string">test</username>
<password xsi:type="xsd:string">prueba</password>
PERL CODE:
use Data::Dumper;
use SOAP::Lite;
my $soap = SOAP::Lite->new();
my $service = $soap->service('https://www.XYZ.cl/ws/webservice/soapdist?wsdl');
my %arg = (username => 'test', password => 'prueba') ;
print Dumper( $service->getEmpresas( %arg ) );
回应:
{'code'=&gt; '0','msg'=&gt; '错误:凭证无效。'};
PHP CLASS:
class ApiQF{
protected $credentials = array('username'=>'','password'=>'');
protected $wsdl = '';
protected $client;
protected $token;
function ApiQF($username=null,$password=null,$ip=null){
if(!$username || !$password)
throw new Exception('You must set a login and password to authenticate.');
if($ip)
$this->wsdl = "http://www.XYZ.cl/ws/webservice/soapdist?wsdl";
else
throw new Exception('No IP.');
$options = array();
$this->client = new Zend_Soap_Client($this->wsdl,$options);
$this->credentials['username'] = $username;
$this->credentials['password'] = $password;
}
public function getProviders(){
$res = $this->client->getEmpresas($this->credentials);
return $res;
}
}
PHP SCRIPT:
<? php
include 'ApiQFm.php';
$ip = 'www.XYZ.cl';
$username = 'test';
$password = 'prueba';
$api = new ApiQF($username,$password,$ip);
echo "GetProviders: ";
print_r($api->getProviders());
?>