Как правильно передать XML request с помощью soap?

  • Автор темы Автор темы ptiZa
  • Дата начала Дата начала

ptiZa

Новичок
Добрый день. Как правильно передать XML request с помощью soap, если есть пример soap запроса и ответа?
Мануалы читала, но примеры не совсем понятны.
Причем, есть условие о наличии авторизации при подключении к сервису
"Аутентификация должна производится по логину и паролю. Для аутентификации необходимо использовать «Digest access authentication»".
 
http://www.php.net/manual/en/soapclient.soapclient.php
Куча примеров в каментах
Также обратите внимание на SOAP_AUTHENTICATION_DIGEST

Объясните чайнику, где нужный пример. Я по данной ссылке не нашла именно отправку xml, только получение и разбор xml ответа. Может, не там ищу.

Объясню ещё раз задачу:
1. Есть веб-сервис, к которому надо с нашего сайта обратиться по http://*.asmx c аутентификацией (это удается сделать)
2. У веб-сервиса есть метод Method, описание которого представлено следующим образом:

Test
The test form is only available for requests from the local machine.
SOAP 1.1
The following is a sample SOAP 1.1 request and response. The placeholders shown need to be replaced with actual values.

POST href HTTP/1.1
Host: host
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "href"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SetMethod xmlns="href">
<Method>
<Debtor />
<LegalCase CaseNumber="string" CourtName="string" Base="string" />
<ArbitrManager SROName="string" RegNum="string" />
<TradeOrganizer />
<TradeInfo AuctionType="OpenAuction or OpenConcours or PublicOffer" FormPrice="OpenForm or CloseForm">
<DatePublishSMI>date</DatePublishSMI>
<DatePublishEFIR>date</DatePublishEFIR>
<Application TimeBegin="dateTime" TimeEnd="dateTime">
<Rules>string</Rules>
</Application>
<Concours>string</Concours>
<SaleAgreement>string</SaleAgreement>
<Payments>string</Payments>
<LotList>
<Lot xsi:nil="true" />
<Lot xsi:nil="true" />
</LotList>
<Attach>
<FileName>string</FileName>
<Type>string</Type>
<Blob>base64Binary</Blob>
</Attach>
</TradeInfo>
</Method>
</SetMethod>
</soap:Body>
</soap:Envelope>

Вопрос: как воспользоваться этим методом и передать в него нужную информацию?
 
Если ты используеш SOAP то тебе ненужно явно передавать xml документ, просто нужно передавать правильно структуру все остальное преобразуеться само.
Вот например мне что б обратиться к этому методу
<xsd:element name="ПолучитьТовары">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Наименование" type="xsd:string"/>
<xsd:element name="Контрагент" type="xsd:string"/>
<xsd:element name="РасходныеСписок" nillable="true" type="xs4:РасходныеСписок"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

я использовал вот такой метод
PHP:
    function m_getTovByNameTov($kod, $nametov) {
        $result = $this->SertifSoapClient->ПолучитьТовары(
                        array("Наименование" => $nametov,
                            "Контрагент" => $kod,
                            "РасходныеСписок" => ''
                ));
        return $result;
    }
Ну соответственно настройки клиента SertifSoapClient у вас свои. Весь код немогу показать только часть, но суть ясна.
$result - ссылка на результат который нужно разобрать
 
Если ты используеш SOAP то тебе ненужно явно передавать xml документ, просто нужно передавать правильно структуру все остальное преобразуеться само.

Изначально для подключения к сервису я пользовалась curl_*
PHP:
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt($curl, CURLOPT_HEADER, false); 
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($curl, CURLOPT_URL, $Host); 
$result = curl_exec($curl);
, подключение осуществлялось, но я не знаю, как передать тогда xml файл.

Если подключаться таким образом:
PHP:
$sc = new SoapClient($Host, array(
							'trace' => 1, 
							'authentication' => SOAP_AUTHENTICATION_DIGEST,
							'login'  => $username,
                            'password'  => $password));
, выдается ошибка
"failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized in... "

Что может быть не так? Сначала первым способом также не удавалось соединиться, пока я не указала
PHP:
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
но во втором способе я же указываю
PHP:
'authentication' => SOAP_AUTHENTICATION_DIGEST,
однако соединиться не удается.

Буду благодарна за любую помощь! (можно писать в личку, если не хочется загромождать кодом этот пост)
 
CURLOPT_HTTPAUTH => CURLAUTH_BASIC ?

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); ?
 
Проверь кодировку на серверах, у меня тоже через CURL подключалось, но когда пробывал через соап то не мог подключиться. Пришлось перекодировать логин и пароль.
 
Работать через CURL с SOAP не нужно. SOAP придумали именно для того, чтобы не заморачиваться деталями реализации запроса, а работать на уровне объектов.
 
Сверху