Читаем 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 и являются ли какие-то поля массивами.
Если во время обработки возникает ошибка, ответ на сообщение SOAP является элементом ошибки SOAP в теле сообщения, и ошибка возвращается отправителю сообщения SOAP.
Механизм сбоя SOAP возвращает конкретную информацию об ошибке, включая предопределенный код, описание и адрес процессора SOAP, который сгенерировал сбой.
Указывает на заметку
-
Сообщение SOAP может содержать только один блок отказа.
-
Ошибка является необязательной частью сообщения SOAP.
-
Для привязки HTTP успешный ответ связан с диапазоном кодов состояния от 200 до 299.
-
Ошибка SOAP связана с диапазоном кодов состояния от 500 до 599.
Сообщение SOAP может содержать только один блок отказа.
Ошибка является необязательной частью сообщения SOAP.
Для привязки HTTP успешный ответ связан с диапазоном кодов состояния от 200 до 299.
Ошибка SOAP связана с диапазоном кодов состояния от 500 до 599.
Подэлементы неисправности
Ошибка SOAP имеет следующие подэлементы –
Sr.No | Подэлемент и описание |
---|---|
1 |
<faultCode> Это текстовый код, используемый для обозначения класса ошибок. В следующей таблице приведен список предопределенных кодов ошибок. |
2 |
<faultString> Это текстовое сообщение, объясняющее ошибку. |
3 |
<faultActor> Это текстовая строка, указывающая, кто вызвал ошибку. Это полезно, если сообщение SOAP проходит через несколько узлов в пути сообщения SOAP, и клиент должен знать, какой узел вызвал ошибку. Узел, который не действует как конечный пункт назначения, должен включать элемент faultActor . |
4 |
<подробно> Это элемент, используемый для передачи сообщений об ошибках приложения. Элемент detail может содержать дочерние элементы, называемые элементами detail. |
<faultCode>
Это текстовый код, используемый для обозначения класса ошибок. В следующей таблице приведен список предопределенных кодов ошибок.
<faultString>
Это текстовое сообщение, объясняющее ошибку.
<faultActor>
Это текстовая строка, указывающая, кто вызвал ошибку. Это полезно, если сообщение SOAP проходит через несколько узлов в пути сообщения SOAP, и клиент должен знать, какой узел вызвал ошибку. Узел, который не действует как конечный пункт назначения, должен включать элемент faultActor .
<подробно>
Это элемент, используемый для передачи сообщений об ошибках приложения. Элемент detail может содержать дочерние элементы, называемые элементами detail.
Коды ошибок SOAP
Определенные ниже значения faultCode должны использоваться в элементе faultcode при описании неисправностей.
Sr.No | Ошибка и описание |
---|---|
1 |
SOAP-ENV: VersionMismatch Обнаружено недопустимое пространство имен для элемента конверта SOAP. |
2 |
SOAP-ENV: MustUnderstand Непосредственный дочерний элемент элемента Header с атрибутом mustUnderstand, установленным в «1», не был понят. |
3 |
SOAP-ENV: Клиент Сообщение было неправильно сформировано или содержало неверную информацию. |
4 |
SOAP-ENV: Сервер Возникла проблема с сервером, поэтому сообщение не удалось продолжить. |
SOAP-ENV: VersionMismatch
Обнаружено недопустимое пространство имен для элемента конверта SOAP.
SOAP-ENV: MustUnderstand
Непосредственный дочерний элемент элемента Header с атрибутом mustUnderstand, установленным в «1», не был понят.
SOAP-ENV: Клиент
Сообщение было неправильно сформировано или содержало неверную информацию.
SOAP-ENV: Сервер
Возникла проблема с сервером, поэтому сообщение не удалось продолжить.
Пример ошибки SOAP
Следующий код является примером неисправности. Клиент запросил метод с именем ValidateCreditCard , но служба не поддерживает такой метод. Это представляет ошибку запроса клиента, и сервер возвращает следующий ответ SOAP –
If an error occurs during processing, the response to a SOAP message is a SOAP fault element in the body of the message, and the fault is returned to the sender of the SOAP message.
The SOAP fault mechanism returns specific information about the error, including a predefined code, a description, and the address of the SOAP processor that generated the fault.
Points to Note
-
A SOAP message can carry only one fault block.
-
Fault is an optional part of a SOAP message.
-
For HTTP binding, a successful response is linked to the 200 to 299 range of status codes.
-
SOAP Fault is linked to the 500 to 599 range of status codes.
Sub-elements of Fault
The SOAP Fault has the following sub elements −
Sr.No | Sub-element & Description |
---|---|
1 |
<faultCode> It is a text code used to indicate a class of errors. See the next Table for a listing of predefined fault codes. |
2 |
<faultString> It is a text message explaining the error. |
3 |
<faultActor> It is a text string indicating who caused the fault. It is useful if the SOAP message travels through several nodes in the SOAP message path, and the client needs to know which node caused the error. A node that does not act as the ultimate destination must include a faultActor element. |
4 |
<detail> It is an element used to carry application-specific error messages. The detail element can contain child elements called detail entries. |
SOAP Fault Codes
The faultCode values defined below must be used in the faultcode element while describing faults.
Sr.No | Error & Description |
---|---|
1 |
SOAP-ENV:VersionMismatch Found an invalid namespace for the SOAP Envelope element. |
2 |
SOAP-ENV:MustUnderstand An immediate child element of the Header element, with the mustUnderstand attribute set to «1», was not understood. |
3 |
SOAP-ENV:Client The message was incorrectly formed or contained incorrect information. |
4 |
SOAP-ENV:Server There was a problem with the server, so the message could not proceed. |
SOAP Fault Example
The following code is a sample Fault. The client has requested a method named ValidateCreditCard, but the service does not support such a method. This represents a client request error, and the server returns the following SOAP response −
<?xml version = '1.0' encoding = 'UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi = "http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode xsi:type = "xsd:string">SOAP-ENV:Client</faultcode> <faultstring xsi:type = "xsd:string"> Failed to locate method (ValidateCreditCard) in class (examplesCreditCard) at /usr/local/ActivePerl-5.6/lib/site_perl/5.6.0/SOAP/Lite.pm line 1555. </faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>