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

ptiZa

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

ptiZa

Новичок
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>

Вопрос: как воспользоваться этим методом и передать в него нужную информацию?
 

aspire

Новичок
Если ты используеш 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 - ссылка на результат который нужно разобрать
 

ptiZa

Новичок
Если ты используеш 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,
однако соединиться не удается.

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

whirlwind

TDD infected, paranoid
CURLOPT_HTTPAUTH => CURLAUTH_BASIC ?

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); ?
 

aspire

Новичок
Проверь кодировку на серверах, у меня тоже через CURL подключалось, но когда пробывал через соап то не мог подключиться. Пришлось перекодировать логин и пароль.
 

Krishna

Продался Java
Работать через CURL с SOAP не нужно. SOAP придумали именно для того, чтобы не заморачиваться деталями реализации запроса, а работать на уровне объектов.
 
Сверху