создание запроса к веб-сервисам с использованием gSoap с аргументами запроса - PullRequest
0 голосов
/ 29 июля 2010

Я пытаюсь преобразовать запрос мыла, написанный для C #, в запрос gSoap в Visual C ++.

Запрос C # добавляет узел XML к вызову запроса, чтобы передать параметры в запрос:

XmlNode queryOpts = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");
queryOpts.InnerXml = "<DateInUtc>TRUE</DateInUtc>";

Вот запрос C #, передающий различные аргументы (некоторые аргументы указаны как объекты XmlNode)

XmlNode nodeListItems = listService.GetListItems("Announcements", null, query, viewFields, null, queryOpts, null);

Запрос C ++ / gSoap позволяет мне передать объект запроса и ответа:

listService.__ns10__GetListItems(&announcementQuery, &announcementResponse)

Объект запроса имеет различные свойства, которые можно установить, связанные с аргументами в вызове C #:

announcementQuery.listName  
announcementQuery.query   
announcementQuery.queryOptions 
announcementQuery.viewFields 

Первый аргумент: строка, нет проблем.

query, queryOptions и viewFields немного сбивают с толку.

«запрос» - это класс типа _ns2__GetListItems_query, и он имеет следующие функции и члены:

soap_default()
soap_get()
soap_in()
soap_out()
soap_put()
soap_serialize()
soap_type()
__any
__mixed

для query, queryOptions и viewFields я просто хотел бы указать строку в формате xml, как это делает код C #, но я не уверен, как это сделать.

Может ли кто-нибудь применить этот опыт?

спасибо!

1 Ответ

0 голосов
/ 29 июня 2011

Я предполагаю, что вы уже нашли ответ на этот вопрос, но я опубликую некоторые заметки для потомков.

Вот простая демонстрация C ++ для отправки и XML-документ в веб-метод ASP.NET.

int _tmain(int argc, _TCHAR* argv[])
{
    Service1SoapProxy proxy;

    _WebServiceNS1__HelloWorld helloWorld;
    _WebServiceNS1__HelloWorld_xml xml;
    _WebServiceNS1__HelloWorldResponse response;

    xml.__any = "<doc><x>hi</x></doc>";
    helloWorld.xml = &xml;

    int result = proxy.HelloWorld(&helloWorld, &response);
    fprintf(stdout, "result: %i\n", result);

    switch(result)
    {
        case SOAP_OK:
            fprintf(stdout, "Response: %s\n", response.HelloWorldResult);
            break;
        default:
            break;
    }

    return 0;
}

Вот тривиальный веб-метод в .NET-сервисе:

[WebMethod]
public string HelloWorld(XmlNode xml)
{
    return string.Format("Your XML: {0}", xml.OuterXml);
}

Если все работает, вы увидите «Response: hi» на вашей консоли.

...