2011-11-21 30 views
4

我已经花了几个小时与SOAPClient,仍然没有结果,希望有人能帮助我。我试图创建和发送到网络服务下面的代码:如何为SOAP客户端函数创建适当的xml?

POST /PortalServices/PortalServices.asmx HTTP/1.1 
Host:***.***.com 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://***.com/CreateUser" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
    <UserCredentials xmlns="http://***.com/"> 
     <UserName>string</UserName> 
     <PassWord>string</PassWord> 
     <ServiceName>string</ServiceName> 
    </UserCredentials> 
    </soap:Header> 
    <soap:Body> 
    <CreateUser xmlns="http://***.com/"> 
     <user> 
     <Name>string</Name> 
     <Email>string</Email> 
     <PassWord>string</PassWord> 
     <WsServices> 
      <WsService> 
      <Id>int</Id> 
      </WsService> 
     </WsServices> 
     </user> 
    </CreateUser> 
    </soap:Body> 
</soap:Envelope> 

为了得到这个XML我使用下面的代码:

<?php 

class WsService { 
public $Id = "****"; 
} 

class WsServices { 
public $WsService; 
public function __construct() { 
     $this->WsService = new WsService(); 
     } 
} 


class WsUser { 

public $Name = 'Sasha Lavasov'; 
public $Email = '[email protected]'; 
public $PassWord = 'test'; 
public $WsServices; 

public function __construct() { 
     $this->WsServices = new WsService(); 
     } 
} 

    $ini = ini_set("soap.wsdl_cache_enabled","0"); 

    $soap_url = 'http://***.***.com/PortalServices/PortalServices.asmx?wsdl'; 
    $soapClient = new \SoapClient($soap_url, array(
     'soap_version'=>SOAP_1_2, 
     'trace' => 1, 
     'exceptions' => true, 
     'cache_wsdl' => WSDL_CACHE_NONE 
     )); 

    $hdd = new stdClass(); 
    $hdd->UserName = '***'; 
    $hdd->PassWord = '***'; 
    $hdd->ServiceName = '***'; 

    $hd = new SoapVar($hdd, SOAP_ENC_OBJECT); 


     $headers = new \SoapHeader('http://***.***.com/PortalServices', 'UserCredentials', $hd); 

     // Prepare Soap Client 
     $soapClient->__setSoapHeaders(array($headers)); 

     $user = new WsUser(); 
     // Setup the CreateUser parameters 
     $ap_param = array(
     'Name' => 'Sasha Lavasov', 
     'WsUser' => $user 
        ); 


     $param = new \SoapParam($user, 'WsUser'); 
     // Call CreateUser() 
     $error = 0; 

     try { 
     //Build user entity 
     $usr = new WsUser(); 
     $wsServices = new StdClass(); 

     $id = new StdClass(); 
     $id->Id = '***'; 
     $wsServices->WsService = $id; 
     $usr->WsServices = $wsServices; 

     $createUser = new stdClass(); 
     $createUser->user = $usr; 

     $createUser = new SoapVar($createUser, SOAP_ENC_OBJECT, "WsUser", "http://***.***.com/PortalServices/PortalServices.asmx?op=CreateUser"); 

     $pm = new SoapParam($createUser, "user"); 

     $soapClient->CreateUser($pm); 
      //Here I get xml 
      var_dump($soapClient->__getLastRequest()); die(); 
     } catch (\SoapFault $fault) { 
      $error = 1; 
      print($fault->faultcode." - ".$fault->faultstring); die(); 
     } 

     if ($error == 0) { 
     //    DO SOMETHING 
      } else { 

      } 

     $res = $soapClient->__getLastResponse(); 
     print_r($res); die(); 

而是我得到这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://***.***.com/PortalServices/PortalServices.asmx?op=CreateUser" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://***.com/" xmlns:ns3="http://***.***.com/PortalServices"> 
<env:Header> 

<ns3:UserCredentials> 
<UserName>***</UserName> 
<PassWord>***</PassWord> 
<ServiceName>***</ServiceName> 
</ns3:UserCredentials></env:Header> 

<env:Body> 
<ns2:CreateUser xsi:type="ns1:WsUser"> 
<user> 
<Name>Sasha Lavasov</Name> 
<Email>[email protected]</Email> 
<PassWord>test</PassWord> 
<WsServices><WsService><Id>***</Id></WsService></WsServices> 
</user> 
</ns2:CreateUser> 
</env:Body> 
</env:Envelope> 

并得到FALSE结果。 在服务器的功能列表(使用__getFunctions()),我有以下几点:

CreateUserResponse CreateUser(CreateUser $parameters) 

谁能帮助我或者只是分不清哪里是我错了?

+1

如果您进行详细比较您认为它的SOAP XML以及您不喜欢的可怜的PHP SoapClient(),唯一的区别是两个名称空间ns1和ns3,这两个名称空间在您的PHP代码中另外指定。 –

+0

@sasha你可以发布WSDL吗? Tnx –

+0

问题是我使用了错误的命名空间,并且是的,WSDL工作。但我使用CURL和正确的xml重写了它。这足够了,因为我只收到1个布尔响应,并且很容易解析。 谢谢,伙计们! –

回答

1

只是一个建议。

在你 XML您已经:

<UserCredentials xmlns="http://***.com/"> 

,但在你的PHP设置:

$headers = new SoapHeader('http://***.***.com/PortalServices', 'UserCredentials', $hd); 

,那么你已经2个不同的命名空间:HTTP:// ** *。***。com/PortalServices而不是http://***.com/