2016-12-06 100 views
0

语境/我想要什么:web服务的SOAP请求 - 错误类型的数据的发送

我现在面临的一个问题,同时呼吁与SOAP web服务。这里有一个形象的WS的相关部分,我想打电话: Picture of the WS I want to call

(本人自愿隐藏命名空间的一部分,这里没有相关的)

我想通过“Demande_de_mot_de_passe”功能和捕捉发送数据这个请求的结果。

在下面的代码中,这个请求是正确的(该函数的名称是好的),我想问题是我想发送的数据的格式。

$client->Demande_de_mot_de_passe($soapVar); 

我已经试过:

这里是我试过的代码的相关部分(我自愿变更资料,但没有值的函数的调用本部提出。否则没有与支架没有错字的错误,它关闭功能和类我没有把这里保持相关部分):

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

我也试图与通过铸造对象的数组与这样的数组(没有成功) S):

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

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

文档我读过有关没有成功:

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

编辑

下面是了SoapUI的WS 'Demande_de_mot_de_passe' 函数调用的捕获: Capture of WS in SoapUI

(对不起,我长的帖子,我希望这是非常明显的,不要忘了,如果需要询问精度,在此先感谢您的帮助:))

+0

据我所知,你的问题是复杂类型的SoapVar实施和复杂性。正如我所看到的,您的请求消息需要一个名为'Demande_de_mot_de_passe'的参数,并且其内部需要一个名为'Demande_de_mot_de_passe_input'的参数。你的例子没有显示方法名称(只是你的代码),我认为这是错误的。尝试使用SoapUI打开WSDL并查看它将显示为请求消息的内容。最后,你的SoapVar实现有一些错误。 –

+0

感谢您的帮助,方法名称很好(如果我尝试了错误的方法,则会触发其他错误),但其他开发人员使用Python脚本对此Webservice进行了调用,并且工作正常。但他只是通过关联数组传递数据,我无法弄清楚为什么这不适用于我的PHP自适应脚本。感谢您的时间伴侣:) –

+0

您是否使用SoapUI打开WSDL?向我显示请求消息或整个WSDL。 –

回答

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创建/解析变量。还有其他的例子,你可以阅读有关(其中一个是我的,但它在葡萄牙)和其他大约是伪造的节点:

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

+0

非常感谢您的帮助,它现在正在工作:) –

+0

我也有一个问题以'0'开头的整数字段,截断数字。例如:005变成5.你知道我该如何解决这个问题? –

+0

对于左整数零没有意义。将格式更改为字符串。必须为序列号,电话,邮政编码和任何可以从零开始的格式来完成。 –