使用C中的SOAP_ENV__Header设置soap标头

时间:2012-01-28 20:25:31

标签: c gsoap

我在尝试使用gsoap设置SOAP标头时遇到了困难。我在这里阅读了常见问题解答:http://www.genivia.com/Help/FAQlist.html#g17

这个答案没有任何帮助: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时,它仍然将其显示为具有虚拟元素,因此我不确定覆盖默认定义的正确方法是什么。常见问题解答中的解释对此细节相当模糊。

当我使用SOAP_ENV__Header的定义破解Stub.h文件并在其中设置值时,当我通过调试器运行它时会显示正确的字段,但它们不会显示在输出XML中。

我在这里缺少什么? 谢谢, 约翰

2 个答案:

答案 0 :(得分:0)

根据gsoap文档,您应该在传递给soapcpp2的.h文件中定义SOAP Header内容。我建议将以下代码移到soapcpp2的.h文件中:

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

然后在该.h文件上重新运行soapcpp2。否则,生成的soapC.cpp序列化程序代码中的序列化程序实现是不完整的。

为了清晰而编辑

答案 1 :(得分:0)

定义soap标头...

#include "soapcalcProxy.h" 
 #include "calc.nsmap" 
 soapStub.h       
 soapH.h          
 soapC.cpp        
 soapClient.cpp