Я недавно столкнулся с этой проблемой, когда помогал клиенту использовать наш веб-сервис .Net, поэтому я решил поделиться этим, если кто-нибудь еще столкнется с этим в будущем.
Спасибо большое за руководство, которое помогло пролить свет на проблему. Вы должны предоставить имя для параметра в массиве, и обратите внимание, что имя чувствительно к регистру.
Рабочий код
try {
$wsdl_url = 'http://<mywebserver>/LeadWs.svc?wsdl';
$client = new SOAPClient($wsdl_url);
$params = array(
'lead' => ""
);
$return = $client->Insert2($params);
print_r($return);
} catch (Exception $e) {
echo "Exception occurred: " . $e;
}
В моих неудачных попытках использовалась заглавная буква «L». Это, очевидно, единственная вещь в WSDL / XSD, которая по умолчанию является строчной. Если вы выполните тщательный поиск по WSDL / XSD, вы увидите точные имена любых параметров, ожидаемых вашим методом. Как только вы это сделаете, SoapClient
обрабатывает остальную часть кодировки XML.
Мой окончательный код выглядел так:
try {
$wsdl_url = 'http://<mywebserver>/LeadWs.svc?wsdl';
$client = new SOAPClient($wsdl_url);
$lead = new Lead(); // Could just be an array as well
// but I created a class to help the user
$lead->FirstName = "Tester";
$lead->LastName = "Test";
$lead->ZipCode = "00000";
$lead->NumberOfTVs = 2;
$params = array('lead' => $lead);
$return = $client->Insert2($params);
print_r($return);
} catch (Exception $e) {
echo "Exception occurred: " . $e;
}
Надеюсь, это поможет кому-то в будущем.