文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>gsoap学习总结

gsoap学习总结

时间:2008-04-30  来源:tempaccount

最近学习了使用gsoap调用webservices,期间遇到一些问题,在此记录。 首先说明的一点是我的C语言不熟悉,基本属于只会部分语法的水平。 所以后面的C的代码也只是实现功能,没有做很好的封装和优化。 测试环境:         1 Webservice服务端 是在windows平台上vs2008         2 Webservice客户端 是redhat 9.0          3 gsoap 是从http://sourceforge.net/project/showfiles.php?group_id=52781下载   自己测试用vs2008写了个测试的webservices代码如下:  

using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{
    public Service1 () {
        //如果使用设计的组件,请取消注释以下行 
        //InitializeComponent(); 
    }
        private CredentialSoapHeader m_credentials;
        public CredentialSoapHeader Credentails
        {
            get { return m_credentials; }
            set { m_credentials = value; }
        }
        //对外发布的服务 
        [WebMethod]
        [SoapHeader("Credentails")]
        public string HelloWorld()
        {
            if (Credentails == null)
            {
                return "SoapHeader Error";
            }
            if (Credentails.Username != "phoenix" || Credentails.Password != "123456")
            {
                return "Credentails";
            }
            return "Hello World";
        }
    }
 public class CredentialSoapHeader : SoapHeader
    {
        private string _userName;
        private string _userPassword;
        public string Username
        {
            get { return _userName; }
            set { _userName = value; }
        }
        public string Password
        {
            get { return _userPassword; }
            set { _userPassword = value; }
        }
    }

  这个服务只有一个功能 1 如果没有设置SoapHeader就报SoapHeader Error ; 2 如果用户名或者密码错误就报Credentails ; 3 正常访问就输出Hello World ;   第2步 在redhat 9.0上安装gsoap.可参照官方文档。我安装的时候只是执行了  

#./configure

#make

#make install

第3步 启动webservice服务通过浏览器访问得到如下界面

Service1

支持下列操作。有关正式定义,请查看服务说明。
HelloWorld
--------------------------------------------------------------------------------

此 Web 服务使用 http://tempuri.org/ 作为默认命名空间。
建议: 公开 XML Web services 之前,请更改默认命名空间。
每个 XML Web services 都需要一个唯一的命名空间,以便客户端应用程序能够将它与 Web 上的其他服务区分开。http://tempuri.org/ 可用于处于开发阶段的 XML Web services,而已发布的 XML Web services 应使用更为永久的命名空间。

应使用您控制的命名空间来标识 XML Web services。例如,可以使用公司的 Internet 域名作为命名空间的一部分。尽管有许多 XML Web services 命名空间看似 URL,但它们不必指向 Web 上的实际资源。(XML Web services 命名空间为 URI。)

使用 ASP.NET 创建 XML Web services 时,可以使用 WebService 特性的 Namespace 属性更改默认命名空间。WebService 特性适用于包含 XML Web services 方法的类。下面的代码实例将命名空间设置为“http://microsoft.com/webservices/”:

C#

[WebService(Namespace="http://microsoft.com/webservices/")]
public class MyWebService {
    // 实现
}
Visual Basic

<WebService(Namespace:="http://microsoft.com/webservices/")> Public Class MyWebService
    

点击 服务说明 可以打开你的wsdl的描述文件的链接http://192.168.1.123/services/Service1.asmx?WSDL   第4步 使用gsoap生成所需的头文件已经其他文件,可参照官方文档生成  

[root@BITMYTHSERVER test]# wsdl2h -c -o aa.h http://192.168.1.123/services/Service1.asmx?WSDL

这个代码是一条命令行.执行完毕会生成一个aa.h的头文件。

[root@BITMYTHSERVER test]# soapcpp2 aa.h

然后执行上面的命令,就可以生成所需的其他头文件和源文件了。

第5步 编写自己的客户端源文件

 

#include "soapH.h"
#include "Service1Soap.nsmap"
#include <iconv.h>
#include <string.h>
#define OUTLEN 255
const char server[] = "http://192.168.1.123/services/Service1.asmx";
int rc;
int main(int argc, char **argv)
{ struct soap soap;
/***/
if (argc < 2)
  { fprintf(stderr, "Usage: [Input account password \n");
    exit(0);
  }
char *in_utf8;
char *in_gb2312=(char *) malloc (70);
strcpy(in_gb2312,argv[4]);
char out[OUTLEN];
//unicode 2 gbk
//rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
//gbk 2 unicode
rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
/***/
struct _ns1__HelloWorld ns1__HelloWorld;
struct _ns1__HelloWorldResponse ns1__HelloWorldResponse;
struct SOAP_ENV__Header header;

struct ns1__CredentialSoapHeader vheader;
vheader.Username=argv[1];
vheader.Password=argv[2];

soap_init(&soap);//初始化
soap_set_mode(&soap, SOAP_C_UTFSTRING);//设置传输模式
header.ns1__CredentialSoapHeader=&vheader;
printf("%s\n",header.ns1__CredentialSoapHeader->Username);
printf("%s\n",header.ns1__CredentialSoapHeader->Password);
soap.header=&header;//设置soap头
soap_call___ns2__HelloWorld(&soap,server,"http://tempuri.org/HelloWorld",&ns1__HelloWorld,&ns1__HelloWorldResponse);
 if (soap.error)
  { soap_print_fault(&soap, stderr);
    exit(1);
  }
  else{
 printf("result = %s\n", ns1__HelloWorldResponse.HelloWorldResult);
}
  soap_destroy(&soap);
  soap_end(&soap);
  soap_done(&soap);
  return 0;
}

//编码转换函数当前没有用到
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE 2 GB2312
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312 2 UNICODE
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}

然后编译上面的代码:

[root@BITMYTHSERVER aa]#cc -o test client.c ../../stdsoap2.c soapC.c soapClient.c

说明一点我的stdsoap2.c文件是在外层目录,所以按照自己的目录指定stdsoap2.c文件目录

然后就可以运行test看结果。

[root@BITMYTHSERVER aa]# cc -o test client.c ../../stdsoap2.c soapC.c soapClient.c
[root@BITMYTHSERVER aa]# ./test phoenix 123456
phoenix
123456
result = Hello World

[root@BITMYTHSERVER aa]# ./test 1 2
1
2
result = Credentails

[root@BITMYTHSERVER aa]#

完毕。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载