Nutshell
Nutshell

Reputation: 8537

Webservice SOAP request - Wrong type of data sent

Context / What I want :

I'm facing an issue while calling a Webservice with SOAP. Here's an image the relevant part of the WS I want to call : Picture of the WS I want to call

(I voluntarily hide the namespace part, not relevant here)

I want to send data through 'Demande_de_mot_de_passe' function and catch result from this request.

In the code below, this request is correct (the name of the function is good), I guess the problem is the formatting of the data I want to send. The call of the function is made with this part :

$client->Demande_de_mot_de_passe($soapVar);

What I've tried :

Here's the relevant part of the code I've tried ( I voluntarily change values of data but nothing else. There is no typo error with the brackets, it close the function and the class I didn't put here to keep the relevant part) :

    $client = new \SoapClient('URL_OF_THE_WS?WSDL', array(
      'trace'        => 1,
      'encoding'     => 'UTF-8',
      'soap_version' => SOAP_1_1,
      'classmap'     => array('Demande_de_mot_de_passe_Input' => 'Demande_de_mot_de_passe_Input')
    ));

    $donnesUtilisateur = new Demande_de_mot_de_passe_Input;
    $donnesUtilisateur->Code_societe = '000';
    $donnesUtilisateur->Ident_type   = 'A';
    $donnesUtilisateur->Ident_code   = 'xxxxxx';
    $donnesUtilisateur->Dat_demande  = '00000000';
    $donnesUtilisateur->Adr_mail     = 'xxxxxx';
    $donnesUtilisateur->Adr_cpos     = 'xxxxxx';
    $donnesUtilisateur->Nom          = 'xxxxxx';
    $donnesUtilisateur->Prenom       = 'xxxxxx';
    $donnesUtilisateur->Dat_naiss    = '00000000';
    $namespace = 'URL_OF_NAMESPACE';

    $soapVar = new \SoapVar($donnesUtilisateur, SOAP_ENC_OBJECT,'Demande_de_mot_de_passe_Input', $namespace);

    $result = $client->Demande_de_mot_de_passe($soapVar);

    print_r($result);

  }
}

class Demande_de_mot_de_passe_Input {
  public $Code_societe;
  public $Ident_type;
  public $Ident_code;
  public $Dat_demande;
  public $Adr_cpos;
  public $Adr_mail;
  public $Nom;
  public $Prenom;
  public $Dat_naiss;
}

I've also tried with passing array of casting an object with the array like this (without success) :

$donnesUtilisateur =  [
      'Code_societe' => '000',
      'Ident_type'  => 'A',
      'Ident_code'  => 'xxxxxx',
      'Dat_demande' => '00000000',
      'Adr_cpos'    => 'xxxxxx',
      'Adr_mail'    => 'xxxxxx',
      'Nom'         => 'xxxxxx',
      'Prenom'      => 'xxxxxx',
      'Dat_naiss'   => '00000000',
    ];

and :

$donnesUtilisateur = (object) [
      'Code_societe' => '000',
      'Ident_type'  => 'A',
      'Ident_code'  => 'xxxxxx',
      'Dat_demande' => '00000000',
      'Adr_cpos'    => 'xxxxxx',
      'Adr_mail'    => 'xxxxxx',
      'Nom'         => 'xxxxxx',
      'Prenom'      => 'xxxxxx',
      'Dat_naiss'   => '00000000',
    ];

Error I get :

SoapFault: Did not receive a 'Demande_de_mot_de_passe_Input' object. in SoapClient->__call()

If I unterstand clearly, the formatting of data sent is not correct but when I try other way to send it, it still reporting the same error.

Docs I've read about without success :

http://www.fvue.nl/wiki/Php:_Soap:_How_to_add_attribute_to_SoapVar

http://grokbase.com/t/php/php-soap/066jkmcz2h/passing-objects-to-soap-server-complextype-classmap

EDIT

Here's a capture of the WS 'Demande_de_mot_de_passe' function call in SoapUI : Capture of WS in SoapUI

(Sorry for the long post, I hope it is clear enough, don't forget to ask about precisions if needed, thanks in advance for your help :) )

Upvotes: 0

Views: 1567

Answers (1)

Gabriel Heming
Gabriel Heming

Reputation: 1165

At your WSDL's type, there's a sequence named Demande_de_mot_de_passe which use a element named Demande_de_mot_de_passeRequest and not Demande_de_mot_de_passe_Input.

Your print from SoapUI describe the message request, but if it's document style, Demande_de_mot_de_passe is a type. On the other hand if it's RPC is the method name.

Starting if it's RPC you can do as showed below. You should use as native object as you can (SOAP will work better with they). A stdObject will be good enough:

$request = new stdClass();

$demande_de_mot_de_passeRequest->Code_societe = '000';
$demande_de_mot_de_passeRequest->Ident_type = 'A';
$demande_de_mot_de_passeRequest->Ident_code = 'xxxxxx';
$demande_de_mot_de_passeRequest->Dat_demande = '00000000';
$demande_de_mot_de_passeRequest->Adr_mail = 'xxxxxx';
$demande_de_mot_de_passeRequest->Adr_cpos = 'xxxxxx';
$demande_de_mot_de_passeRequest->Nom = 'xxxxxx';
$demande_de_mot_de_passeRequest->Prenom = 'xxxxxx';
$demande_de_mot_de_passeRequest->Dat_naiss = '00000000';

$request->Demande_de_mot_de_passeRequest = $demande_de_mot_de_passeRequest;

$response = $client->Demande_de_mot_de_passe($request);

If your SOAP binding is document, you just have to add a new upper level named Demande_de_mot_de_passe

/** The variable $demande_de_mot_de_passeRequest is created as above **/

$demande_de_mot_de_passe = new stdClass();
$demande_de_mot_de_passe->Demande_de_mot_de_passeRequest = $demande_de_mot_de_passeRequest;
$request->Demande_de_mot_de_passe = $demande_de_mot_de_passe;

$response = $client->Demande_de_mot_de_passe($request);

Your WSDL doesn't need a list/collections (it's not your case), so you don't need to create/parse variables with SoapVar. There's others examples that you can read about (one is mine, but it's in portuguese) and other is about the BOGUS node:

http://forum.imasters.com.br/topic/535213-enviar-xml-via-soap/?p=2137411 http://www.fischco.org/blog/2011/3/26/php-soapserver-objects-arrays-and-encoding.html

Upvotes: 1

Related Questions