使用SoapUI将凭据发送到Web服务

时间:2014-11-23 21:38:30

标签: web-services wsdl soapui credentials

我正在尝试使用需要凭据的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());
?>

0 个答案:

没有答案