@cajka-d

Что означет ошибка, которую выводит SOAP-клиент?

Здравствуйте.

Не получается получить данные от SOAP-сервера.

Выдает ошибку:
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'Type' property


Код клиента:

<?php
$client = new SoapClient(
	    'http://89.208.141.8/CargoMSK/ws/Cargo3WS.1cws?wsdl',
            array(
                'login' => "web",         // логин
                'password' => "web",  // пароль
            )
        );

$a = array(
	'login' => 'login',
	'password' => 'password',
	'documents' => array(
		'Key' => 'Documents',
		'Properties' => array(
			'Key' => 'DocumentType',
			'Value ' => 'Order',
			'ValueType' => 'string',
		),
		'List' => array(
			array('Key' => '00-00000497004')
		)
	),
	'parameters' => array(
		'Key' => 'Parameters',
	)
);

$d = $client->Tracking($a);

print_r($d);
?>


Возможно, кто-то подскажет, что делаю не так.
  • Вопрос задан
  • 357 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Читаем wsdl. Находим нужный запрос.
operation Tracking
<operation name="Tracking">
  <input message="tns:TrackingRequestMessage"/>
  <output message="tns:TrackingResponseMessage"/>
</operation>

Значит запрос Tracking принимает на вход TrackingRequestMessage. Смотрим дальше
message TrackingRequestMessage
<message name="TrackingRequestMessage">
  <part name="parameters" element="tns:Tracking"/>
</message>

Единственное поле parameters с типом Tracking. Ищем этот тип.
element Tracking
<xs:element name="Tracking">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Language" type="xs:string" nillable="true"/>
      <xs:element name="Login" type="xs:string" nillable="true"/>
      <xs:element name="Password" type="xs:string" nillable="true"/>
      <xs:element name="Type" type="xs:string"/>
      <xs:element name="Documents" type="xs:string" nillable="true"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Получаем объект или ассоциативный массив с текстовыми полями Language, Login, Password, Type и Documents, причём все поля кроме Type могут иметь значение null.
Значит запрос должен выглядеть как
$result = $client->Tracking([
    'Language' => ?string,
    'Login' => ?string,
    'Password' => ?string,
    'Type' => string,
    'Documents' => ?string
]);

То же самое можно получить и средствами PHP. После подключения к клиенту получим список методов.
var_dump($client->__getFunctions());
/* ...
[92] => string(47) "TrackingResponse Tracking(Tracking $parameters)"
... */

Значит метод Tracking принимает один параметр с типом Tracking и возвращает ответ типа TrackingResponse.
Запросим типы.
var_dump($client->__getTypes());
Результат запроса
/* ...
[120] => string(103) "struct Tracking {
 string Language;
 string Login;
 string Password;
 string Type;
 string Documents;
}"
[121] => string(51) "struct TrackingResponse {
 ResultTracking return;
}"
[24] => string(81) "struct ResultTracking {
 TrackingInfo Items;
 boolean Error;
 string ErrorInfo;
}"
[28] => string(227) "struct TrackingInfo {
 boolean Error;
 string Type;
 string Number;
 string Info;
 string AgentURL;
 dateTime CreateDate;
 string State;
 dateTime DeliveryDate;
 string DeliveryInfo;
 TrackingEvent History;
 Waybill Waybills;
}"
[27] => string(83) "struct TrackingEvent {
 dateTime EventDate;
 string EventName;
 string EventInfo;
}"
[31] => string(546) "struct Waybill {
 string Type;
 string Number;
 dateTime CreateDate;
 string State;
 dateTime DeliveryDate;
 string Sender;
 string SenderGeography;
 string Recipient;
 string RecipientGeography;
 string RecipientAddress;
 dateTime SendDate;
 string Payer;
 int CargoQty;
 float NetWeight;
 float GrossWeight;
 string ConsolidationNumber;
 string InventoryWaybillNumber;
 string DeliveryMethod;
 float Volume;
 boolean RequirePaymentInCash;
 float PaymentInCash;
 string PaymentInCashCurrency;
 string RecipientOfficial;
 TrackingEvent History;
}"
... */


Единственное отличие от самостоятельного анализа wsdl - не указано, какие поля необязательные, какие можно заполнять null и являются ли какие-то поля массивами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы