【发布时间】:2016-12-06 11:36:27
【问题描述】:
上下文/我想要什么:
我在使用 SOAP 调用 Web 服务时遇到问题。这是我要调用的 WS 相关部分的图像:
(我自愿隐藏命名空间部分,这里不相关)
我想通过 '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;
}
我也尝试过用这样的数组传递一个对象的数组(没有成功):
$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
编辑
以下是 SoapUI 中 WS 'Demande_de_mot_de_passe' 函数调用的捕获:
(对不起,帖子太长了,我希望它足够清楚,如果需要不要忘记询问精度,提前感谢您的帮助:))
【问题讨论】:
-
AFAIK,您的问题在于 SoapVar 的实现和 complexType 的复杂性。如我所见,您的请求消息需要一个名为
Demande_de_mot_de_passe的参数,其中需要一个名为Demande_de_mot_de_passe_input的参数。您的示例没有显示方法名称(只是您的代码),我认为这是错误的。尝试使用 SoapUI 打开 WSDL 并查看它将显示为请求消息的内容。最后,您的 SoapVar 实现有一些错误。 -
感谢您的帮助,方法名称很好(如果我尝试错误,则会触发另一个错误),另一个开发人员使用 Python 脚本调用了此 Web 服务,它工作正常.但他只是通过关联数组传递数据,我不知道为什么这不适用于我的 PHP 改编脚本。谢谢你的时间伙伴:)
-
您是否使用 SoapUI 打开了 WSDL?显示请求消息或整个 WSDL。
-
在 SoapUI 中,我已经能够使用我在 PHP 代码中解释的那些参数发送“Demande_de_mot_de_passe”请求。 ($donnesUtilisateur 中的那些) 但是,我不知道我的 PHP 代码有什么问题。感谢您的宝贵时间
-
这就是我需要帮助你的东西,看看 SoapUI 作为 XML 请求创建了什么。
标签: php web-services soap