Web服务SOAP请求 - 发送的数据类型错误

时间:2016-12-06 11:36:28

标签: php web-services soap

背景/我想要的:

我在使用SOAP调用Webservice时遇到了问题。这是我想要调用的WS的相关部分的图像: Picture of the WS I want to call

(我自愿隐藏命名空间部分,这里不相关)

我想通过' Demande_de_mot_de_passe' 函数发送数据,并从此请求中捕获结果。

在下面的代码中,这个请求是正确的(函数的名称是好的),我想问题是我要发送的数据的格式。函数的调用是用这部分完成的:

$client->Demande_de_mot_de_passe($soapVar);

我尝试过的事情:

这里是我尝试的代码的相关部分(我自愿更改数据的值,但没有别的。括号中没有拼写错误,它关闭了函数和我没有的类#&# 39;放在这里保留相关部分):

    $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;
}

我也试过像这样传递一个带有数组的对象的数组(没有成功):

$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',
    ];

和:

$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',
    ];

我收到错误:

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

如果我清楚地发现,发送的数据格式不正确,但当我尝试其他方式发送时,它仍然报告相同的错误。

我没有成功读过的文档:

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

修改

在这里捕获了WS' Demande_de_mot_de_passe' SoapUI中的函数调用: Capture of WS in SoapUI

(对不起,很长的帖子,我希望它很清楚,如果需要,不要忘记询问精度,提前感谢您的帮助:))

1 个答案:

答案 0 :(得分:1)

在您的WSDL类型中,有一个名为Demande_de_mot_de_passe的序列,它使用名为Demande_de_mot_de_passeRequest而不是Demande_de_mot_de_passe_Input的元素。

来自SoapUI的打印描述了消息请求,但如果它是document样式,则Demande_de_mot_de_passe是一种类型。另一方面,如果RPC是方法名称。

如果它是RPC,则可以执行如下所示的操作。您应该尽可能使用本机对象(SOAP可以更好地使用它们)。 stdObject就足够了:

$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);

如果您的SOAP绑定是文档,则只需添加名为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);

您的WSDL不需要列表/集合(这不是您的情况),因此您不需要使用SoapVar创建/解析变量。您可以阅读其他一些示例(一个是我的,但它是葡萄牙语),另一个是关于BOGUS节点:

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