gSoap 的简单应用

47 篇文章 7 订阅
6 篇文章 0 订阅

最近关注一些 Application Server 开发的问题,试用了一下 gSoap。

 

gSoap 实际上一个编译器,包含两个工具:

 

wsdl2h 用于将 WSDL 文件转换成头文件

 

soapcpp2 用于将头文件转换成编写 SOAP 服务器和客户端所需要的文件

 

还是从最简单的 HelloWorld 程序来认识 gSoap

 

下面的是实现两个整数相加的 SOAP 程序

 

//gsoap ns service name: add
//gsoap ns service namespace:
http://192.168.88.1/add.wsdl
//gsoap ns service location:
http://192.168.88.1
//gsoap ns service executable: add.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:add
 
int ns__add( int num1, int num2, int* sum );

 

需要执行的过程是:

 

soapcpp2.exe add.h

 

然后编写服务器和客户端的代码。

 

为了进一步了解 SOAP 底层的过程,可以截取数据包进行查看

 

客户端发生的信息:

 

POST / HTTP/1.0
Host: 192.168.88.1
User-Agent: gSOAP/2.1
Content-Type: text/xml; charset=utf-8
Content-Length: 438
SOAPAction: ""

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:ns="urn:add" xmlns="urn:add" SOAP-ENV:encodingStyle="encoded">
<SOAP-ENV:Body>
<ns:add>
<num1>2</num1>
<num2>5</num2>
</ns:add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

 

服务器的响应信息:

 

HTTP/1.0 200 OK
Server: gSOAP/2.1
Content-Type: text/xml; charset=utf-8
Content-Length: 438

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:ns="urn:add" xmlns="urn:add" SOAP-ENV:encodingStyle="encoded">
<SOAP-ENV:Body><ns:addResponse>
<sum>7</sum>
</ns:addResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

 

得到实际的 HTTP 信息之后,直接利用 python 可以很容易写出客户端的代码

 

import urllib2
import sys, httplib

def SendRtx(num1, num2):
    SENDTPL = /
            '''<?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:add" xmlns="urn:add" SOAP-ENV:encodingStyle="encoded">
        <SOAP-ENV:Body>
            <ns:add>
                <num1>%s</num1>
                <num2>%s</num2>
                </ns:add>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>'''
    SoapMessage = SENDTPL % (num1,num2)
    webservice = httplib.HTTP("192.168.88.1", 4567)
    webservice.putrequest("POST", "/")
    webservice.putheader("Host", "192.168.88.1")
    webservice.putheader("User-Agent", "Python Post")
    webservice.putheader("Content-type", "text/xml; charset=/"UTF-8/"")
    webservice.putheader("Content-length", "%d" % len(SoapMessage))
    webservice.putheader("SOAPAction", "")
    webservice.endheaders()
    webservice.send(SoapMessage)
    # get the response
    statuscode, statusmessage, header = webservice.getreply()
    print "Response: ", statuscode, statusmessage
    print "headers: ", header
    print webservice.getfile().read()

SendRtx(1, 1)

 

 

之后尝试利用 jQuery 编写 ajax 代码来访问 SOAP 服务,悲剧的是居然有兼容性问题,只有 IE 能够正常调用。

 

像 firefox 和 chrome 都会发送一些糟糕的 Internal Server Error。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值