2017-09-11 2 views
0

Je suis en train de faire la demande avec cette structure:client PHP Soap avec des types complexes

<SOAP-ENV:Body> 
    <ns1:getCreditReportTypes> 
    <reportTypeRequest> 
     <reportParams xsi:type="ns1:personCreditReportParams"> 
     <personId>4</personId> 
     <consentConfirmed>true</consentConfirmed> 
     </reportParams> 
    </reportTypeRequest> 
    </ns1:getCreditReportTypes> 
</SOAP-ENV:Body> 

Voici mon php-code:

$obj = new \stdClass(); 
$obj->personId = 4; 
$obj->consentConfirmed = true; 
$data = new \SoapVar($obj, SOAP_ENC_OBJECT, "personCreditReportParams", $namespace, "reportParams"); 
$res = $this->client->getCreditReportTypes(new \SoapParam($data,"reportTypeRequest")); 

Cependant, php génère XML non valide:

<SOAP-ENV:Body> 
    <ns1:getCreditReportTypes xsi:type="ns1:personCreditReportParams"> 
    <consentConfirmed>true</consentConfirmed> 
    <personId>4</personId> 
    </ns1:getCreditReportTypes> 
</SOAP-ENV:Body> 

Comment puis-je créer un XML valide avec object-way?

Répondre

1

Pour ceux qui auront le même problème. Ma solution consiste à utiliser nusoap (https://github.com/yaim/nusoap-php7). Cette bibliothèque vous permet de faire des demandes compliquées, y compris SWA (SOAP avec pièces jointes). Voici le code de travail pour ma question:

$person = array("personId"=>$id, "consentConfirmed"=>$confirmed); 
$data = array(
    "reportParams"=>new soapval("reportParams", "personCreditReportParams", $person, false, $namespace) 
); 
$result = $client->call("getCreditReportTypes", $data, $namespace); 

post-scriptum J'ai essayé quelques générateurs et personne ne pouvait faire une demande correcte, bien que les classes aient été générées correctement.

0

Vous devez utiliser définitivement un générateur WSDL vers php tel que PackageGenerator.

Cela vous facilitera la construction de la demande, la gestion des réponses.

+0

Merci pour la réponse, mais cela n'a pas fonctionné. Je pense que c'est à cause de l'héritage. PackageGenerator a créé la classe abstraite reportParams et la classe personCreditReportParams, mais il ne crée pas l'élément alors que je transmets la variable de la classe personCreditReportParams –

+0

dans ce cas vous pouvez toujours remplacer l'objet SoapClient en utilisant votre propre implémentation dans https://github.com/WsdlToPhp/PackageEws365/blob/develop/SoapClient/SoapClient.php afin de modifier la requête XML avant qu'elle ne soit réellement envoyée. Regardez les options de génération dans https://github.com/WsdlToPhp/PackageEws365/blob/develop/generate.sh –