我在尝试使用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中。
我在这里缺少什么? 谢谢, 约翰
答案 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