Установка мыльного заголовка с помощью SOAP_ENV__Header в C - PullRequest
1 голос
/ 29 января 2012

У меня были трудности с попыткой установить заголовок SOAP с помощью gsoap.Я прочитал FAQ здесь: http://www.genivia.com/Help/FAQlist.html#g17

Этот ответ не помог: Как передать информацию заголовка в заголовок SOAP_ENV__Header, в c ++, используя gsoap

Предполагается, что произошла какая-то магическая каста для приведения фиктивного элемента в SOAP_ENV__Header к требуемому типу данных.

Вот мой код:

#include <stdio.h>
#include <time.h>

struct SOAP_ENV__Header {
    char *authwsns__token;
    char *authwsns__ip;
};
#define SOAP_TYPE_SOAP_ENV__Header struct SOAP_ENV__Header

#include "authservicesH.h"
#include "AuthServicesBinding.nsmap"

int
main(int argc, char **argv) {

    struct soap *soap;
    struct authwsns__GetTokenRequest *request;
    struct authwsns__GetTokenResult *result;

    soap = soap_new();
    soap->header = (struct SOAP_ENV__Header *)soap_malloc(soap, sizeof(struct SOAP_ENV__Header));
    soap->header->authwsns__token = "jc09bdd";
    soap->header->authwsns__ip = "10.10.10.10";

    request = (struct authwsns__GetTokenRequest *)malloc(sizeof(struct authwsns__GetTokenRequest));
    result = (struct authwsns__GetTokenResult *)malloc(sizeof(struct authwsns__GetTokenResult));

    request->tokenBase = id;

    soap_call___authwsns__getToken(soap, "http://", NULL, request, result);

    if (result->tdsns__errorReport) {
        printf("Web services error\n");
        printf("Level:   %s\n",result->tdsns__errorReport->level);
        printf("Message: %s\n",result->tdsns__errorReport->message);
    } else {
        printf("Token is %s\n",result->token);
    }
    soap_end(soap);
    soap_free(soap);
    free(request);
    free(result);
}

Когда я запускаю свою программу через отладчики отображать SOAP_ENV__Header, он по-прежнему показывает наличие фиктивного элемента, поэтому я не уверен, как правильно переопределить определение по умолчанию.Объяснение в FAQ довольно расплывчато в деталях этого.

Когда я взламываю файл Stub.h с моим определением SOAP_ENV__Header и устанавливаю в нем значения, правильные поля появляются, когда я запускаю его черезотладчик, но они не отображаются в выходном XML.

Что мне здесь не хватает?Спасибо, Джон

Ответы [ 2 ]

0 голосов
/ 10 июля 2012

Чтобы определить заголовок мыла ...

#include "soapcalcProxy.h" 
 #include "calc.nsmap" 
 soapStub.h       
 soapH.h          
 soapC.cpp        
 soapClient.cpp 
0 голосов
/ 11 февраля 2012

Согласно документации gsoap, вы должны определить содержимое заголовка SOAP в файле .h, который вы передаете soapcpp2. Я рекомендую переместить следующий код в файл .h для soapcpp2:

struct SOAP_ENV__Header {
    char *authwsns__token;
    char *authwsns__ip;
};

Затем повторно запустите soapcpp2 для этого файла .h. В противном случае реализации сериализатора в сгенерированном коде сериализатора soapC.cpp будут неполными.

Отредактировано для ясности

...