背景/我想要的:
我在使用SOAP调用Webservice时遇到了问题。这是我想要调用的WS的相关部分的图像:
(我自愿隐藏命名空间部分,这里不相关)
我想通过' 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中的函数调用:
(对不起,很长的帖子,我希望它很清楚,如果需要,不要忘记询问精度,提前感谢您的帮助:))
答案 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