Добрый день, помогите, пожалуйста, уважаемые хабровчане!
Пытаюсь разобраться в 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 сообщения.
Или, может, мне кривой образец дали?