limon_spb
@limon_spb

Как правильно составить SOAP сообщение? (C++ Qt)?

Добрый день, помогите, пожалуйста, уважаемые хабровчане!


Пытаюсь разобраться в SOAP.

Необходимо составить сообщение по образцу.

Использую QtCreator. Установил QtSoap. Сообщения тестовые составляются и отправляются, например вот:

QtSoapMessage request;

    request.setMethod("procedure", ""); // Вызываемая процедура

    QtSoapArray * array = new QtSoapArray(QtSoapQName("arrayName"), QtSoapType::Array, 2);

    QtSoapStruct * struct1 = new QtSoapStruct(QtSoapQName("testName"));
    array->append(struct1);

    QtSoapStruct * struct2 = new QtSoapStruct(QtSoapQName("testName"));
    array->append(struct2);

    request.addMethodArgument(array);

    this->send(request); //отправляем, используя QtSoapHttpTransport



Вот, что приходит на сервер:
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <procedure>
    <arrayName
      SOAP-ENC:arrayType="xsd:struct[2]"
      xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
      xsi:type="xsd:Array"
      xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
    >
      <item SOAP-ENV:position="[0]" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
      <item SOAP-ENV:position="[1]" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
    </arrayName>
  </procedure>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>



Что здесь не так:


1. В первом теге «SOAP-ENV:Envelope» ссылки не совсем те. В нем же нужно добавить еще параметров всяких своих типа xmlns:*** = «http://***»

2. В теге Body нужно убрать все параметры.

3. В теге procedure нужен атрибут SOAP-ENV:encodingStyle = «http://***»

4. В теге arrayName должен быть атрибут xsi:type = «SOAP-ENC:Array»

5. Там же SOAP-ENC:itemType = "***"

6. Там же SOAP:ENC:arraySize = "***"

7. У каждого элемента массива нужно убрать все теги.


Вот дока по QtSoap doc.qt.digia.com/solutions/4/qtsoap/index.html

там даже есть пример.


Различные QtSoapType::setHref/setId не помогают и, наверное, не должны.


Хоть убейте, я не нашел там ничего, что бы мне помогло в этих вопросах.


Вероятно, можно самому составить XML и отдать её на растерзание в request:

QtSoapMessage request;
    QDomDocument document;
    //составляем XML
    request.setContent(document);//запихиваем в request
    //отправляем


тогда получаем что-то такое (если документ совсем не заполнить)

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/1999/XMLSchema"/>


Но в этом случае остается открытым вопрос, как дописать в главный тег своих атрибутов.

Да и вообще, наверное, это неправильно и довольно нудно руками составлять SOAP сообщения.

Или, может, мне кривой образец дали?
  • Вопрос задан
  • 7274 просмотра
Пригласить эксперта
Ответы на вопрос 2
RedOctoberCZ
@RedOctoberCZ
Попробуйте использовать gSOAP Toolkit, возможно поможет разобраться. Либо Qt SOAP Manager.
Ответ написан
@kxyu
Qt SOAP не совсем родной, он входид в Qt Solutions (в Qt не входит, ситуация с поддержкой не совсем ясная). По моему опыту степень совместимости различных реализаций SOAPа близка к нулевой — то есть, если у вас сервис на .NET и клиент на .NET, то, может быть, все будет работать как должно. Поэтому генерировать запросы вручную — самый простой и надежный способ. Разбирать соответственно тоже вручную, например, с помощью xpath.

Особых проблем это не вызывает, так код формирования и разбора сообщения достаточно абстрактен и пишется один раз.
Ответ написан
Ваш ответ на вопрос

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

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