2011-03-22 67 views
1

我是使用gsoap的新手。我只有4个使用C++的小型成功案例,但受到我当前项目的制约,无法设置源代码生成选项来创建纯粹的ANSI C(而不是C++)。我似乎无法成功调用服务,返回的错误是0000005,并给出了下面的代码片段,任何人都可以提出建议,以我应该做的是不同的:gsoap ANSI C - 使用gsoap定义的ANSI C客户端调用存根正确

片段包括
1.客户端功能定义,
2. NS7结构闪避,
3.简单的调用应用程序:
谢谢

这里是客户端调用:

#include "soapH.h" 
#include "addressByAccount_ExtWS_BPELSOAP.nsmap" 

SOAP_FMAC5 int SOAP_FMAC6 soap_call___ns1__accountsBPEL(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _ns7__accounts *ns7__accounts, struct  _ns9__accountsResponse *ns9__accountsResponse) 
{   
     struct __ns1__accountsBPEL soap_tmp___ns1__accountsBPEL; 
     if (!soap_endpoint)  
      soap_endpoint = "http://cctest3-v.physio-control.com:8080/ccx/addressByAccount-ExtWS-BPEL";  
     if (!soap_action) 
     soap_action = "http://www.physio-control.com/addressByAccount-ExtWS-BPEL/1.0/accounts"; 
    soap->encodingStyle = NULL; 
    soap_tmp___ns1__accountsBPEL.ns7__accounts = ns7__accounts; 
    soap_begin(soap); 
    soap_serializeheader(soap); 
    soap_serialize___ns1__accountsBPEL(soap, &soap_tmp___ns1__accountsBPEL); 
    if (soap_begin_count(soap)) 
      return soap->error; 
    if (soap->mode & SOAP_IO_LENGTH) 
    { if (soap_envelope_begin_out(soap) 
     || soap_putheader(soap) 
     || soap_body_begin_out(soap) 
     || soap_put___ns1__accountsBPEL(soap, &soap_tmp___ns1__accountsBPEL, "-ns1:accountsBPEL", NULL) 
     || soap_body_end_out(soap) 
     || soap_envelope_end_out(soap)) 
      return soap->error; 
    } 
    if (soap_end_count(soap)) 
     return soap->error; 
    if (soap_connect(soap, soap_endpoint, soap_action) 
    || soap_envelope_begin_out(soap) 
    || soap_putheader(soap) 
    || soap_body_begin_out(soap) 
    || soap_put___ns1__accountsBPEL(soap, &soap_tmp___ns1__accountsBPEL, "-ns1:accountsBPEL", NULL) 
    || soap_body_end_out(soap) 
    || soap_envelope_end_out(soap) 
    || soap_end_send(soap)) 
     return soap_closesock(soap); 
    if (!ns9__accountsResponse) 
     return soap_closesock(soap); 
    soap_default__ns9__accountsResponse(soap, ns9__accountsResponse); 
    if (soap_begin_recv(soap) 
    || soap_envelope_begin_in(soap) 
    || soap_recv_header(soap) 
    || soap_body_begin_in(soap)) 
     return soap_closesock(soap); 
    soap_get__ns9__accountsResponse(soap, ns9__accountsResponse, "ns9:accountsResponse", ""); 
    if (soap->error) 
     return soap_recv_fault(soap, 0); 
    if (soap_body_end_in(soap) 
    || soap_envelope_end_in(soap) 
    || soap_end_recv(soap)) 
     return soap_closesock(soap); 
    return soap_closesock(soap); 
} 

这里是NS7结构:

struct _ns7__accounts 
{ 
    int __sizeaccountNumber; /* sequence of elements <accountNumber> */ 
    char **accountNumber; /* required element of type xsd:string */ 
    char *requestIDTrackingForESB; /* optional attribute of type xsd:string */ 
}; 

下面是一个简单的应用程序使用客户端呼叫呼叫服务:

struct _ns7__accounts in, *pIn; 
struct _ns9__accountsResponse out, *pOut; 
int main(void) 
{ 
    struct soap *soap = soap_new(); 

    //used to populate char ** in pIn 
    char *pNumber=malloc(sizeof("00000201")); 
    strcpy(pNumber, "00000201"); 

    pOut = &out; 
    pIn = &in; 

    pIn->__sizeaccountNumber = sizeof("00000201"); 
    pIn->accountNumber = &pNumber; 
    pIn->requestIDTrackingForESB = malloc(sizeof("")); 
    strcpy(pIn->requestIDTrackingForESB,""); 

    if (soap_call___ns1__accountsBPEL(soap, "", "", pIn, pOut)== SOAP_OK) 
    { 
     printf("Soap OK..."); 
    } 
    else 
    { 
     printf(pIn->requestIDTrackingForESB); 
     soap_print_fault(soap, stderr); 
    } 
    soap_end(soap); 
    soap_free(soap); 

    return 0; 
} 
+0

我不知道gSOAP,但是我发现为'soap_endpoint'和'soap_action'传递'''''是很奇怪的。也许它适用于'soap_call ___ ns1__accountsBPEL(soap,NULL,NULL,pIn,pOut)',看到函数内部的值被NULL替换。 – pmg 2011-03-22 18:37:20

+0

_soap_endpoint_和_soap_action_的“”条目只是最近的。我已经尝试过NULL和0这些参数也都具有相同的效果。 - 谢谢,Ryk – ryyker 2011-03-22 21:08:29

回答

1
pIn->__sizeaccountNumber = sizeof("00000201"); 

__sizeaccountNumber应该设置为数组(1)的大小,而不是数组中第一个成员的大小。因为一个字符串是以null结尾的,所以不需要指定字符串的大小。

而且如已经被pmg评论过的,不要通过""来表示soap_endpoint和soap_action。您可以在功能中看到它为这些参数定义了默认值,但只有在您通过0(或NULL)时才能看到。

if (!soap_endpoint)  
    soap_endpoint = "http://cctest3-v.physio-control.com:8080/ccx/addressByAccount-ExtWS-BPEL";  
if (!soap_action) 
    soap_action = "http://www.physio-control.com/addressByAccount-ExtWS-BPEL/1.0/accounts";