2012-01-28 5 views
1

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

Этот ответ не был какой-либо помощи: How to pass header information to the soap header SOAP_ENV__Header, in c++ using 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.

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

ответ

0

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

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

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

Edited для ясности

0

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

#include "soapcalcProxy.h" 
#include "calc.nsmap" 
soapStub.h  
soapH.h   
soapC.cpp   
soapClient.cpp 
Смежные вопросы