现在的位置: 首页 > 综合 > 正文

Linux下用gSOAP开发Web Service服务端和客户端程序(三)

2013年11月10日 ⁄ 综合 ⁄ 共 1409字 ⁄ 字号 评论关闭

转载自:

http://blog.163.com/yzb_mq/blog/static/2408156201022383927658/

 

接(二)

5、方便其它平台调用Web Service服务所需要做的工作:

以上的C和C++版本的Web Service服务端运行后,在本机或者其它机(windows系统也一样)浏览器中输入http://192.168.1.88:9000/SmsWBS?wsdl,会返回XML文件内容,但是并无Web Service的功能函数描述,原因是尚未实现允许客户端通过http的get操作来获取 SmsWBS.wsdl文件。因此,需要补充实现这一部分,以C++版本为例,完善后的SmsWBSserver.cpp程序是:

#include "soapSmsWBSService.h"
#include "SmsWBS.nsmap"

int http_get(struct soap * soap);

int main(int argc, char **argv)
{
 SmsWBSService sms;

 if (argc < 2)
  sms.serve();       /* serve as CGI application */
 else
 {
  int port = atoi(argv[1]);

  if (!port)
  {
   fprintf(stderr, "Usage: SmsWBSserver++ <port>\n");
   exit(0);
  }

  /* run iterative server on port until fatal error */
  sms.fget = http_get;

  if (sms.run(port))
  {
   sms.soap_stream_fault(std::cerr);
   exit(-1);
  }
 }

 return 0;
}

int SmsWBSService::add(int num1, int num2, int *sum)
{
 *sum = num1 + num2;
 return SOAP_OK;
}

//能够远程读取wsdl文件
int http_get(struct soap * soap)
{
 FILE *fd = NULL;

 char *s = strchr(soap->path, '?');
 if (!s || strcmp(s, "?wsdl"))
  return SOAP_GET_METHOD;

 fd = fopen("SmsWBS.wsdl", "rb");

 if (!fd)
  return 404;

 soap->http_content = "text/xml";

 soap_response(soap, SOAP_FILE);

 for (;;)
 {
 size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
 if (!r)
   break;
 if (soap_send_raw(soap, soap->tmpbuf, r))
   break;
 }

 fclose(fd);
 soap_end_send(soap);

 return SOAP_OK;
}

重新将服务端编译,运行后http://192.168.1.88:9000/SmsWBS?wsdl能够获取到完整的SmsWBS.wsdl。

至此,可以在windows下的VC++.Net项目中通过“添加WEB 引用”来方便地生成客户端类文件,从而调用Web Service服务端的功能。

 (全文完)

 

抱歉!评论已关闭.