首页 > 代码库 > [Python]webservice学习(2) --自己写soap消息请求服务

[Python]webservice学习(2) --自己写soap消息请求服务

上文中webservice学习(1) ,使用soaplib建立了一个超简单的webservice服务,也是用suds调用成功了,那如果想使用http包自己组成一个soap消息来调用接口怎么办呢?

这个时候我们就想到使用wsdl这个文件了,我看了些wsdl的文档,也参照这其他人使用java,php等语言实现的soap消息调用的格式来写,但是怎么调试都没成功。。


就是说他总是会返回500或者是405各种错误,就是下面代码中的old_soap_body 变量中的消息格式。

#coding: utf-8
__author__= ‘orangleliu‘
__version__ = ‘0.1‘

‘‘‘
filename:  soaplib_test_http_client.py
create date: 2014-05-12
测试怎么样使用http来调用webservice,还没有解决,
不成功 总是返回找不到方法,很奇怪,也没有soap的文档。。。。。
‘‘‘

import httplib, urllib, urllib2, time
import pprint
import xml.dom.minidom as dm

soap_host = ‘127.0.0.1‘
soap_port = 7789

old_soap_body = ‘‘‘<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  <soap:Body>
    <tns:say_hello xmlns:tns="http://localhost:7789/">
        <tns:name>orangleliu</tns:name>
        <tns:times>10</tns:times>
    </tns:say_hello>
  </soap:Body>
</soap:Envelope>
‘‘‘

soap_body = ‘‘‘<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="tns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <ns0:Body>
      <ns1:say_hello>
         <ns1:name>Dave</ns1:name>
         <ns1:times>5</ns1:times>
      </ns1:say_hello>
   </ns0:Body>
</SOAP-ENV:Envelope>
‘‘‘


req_header = { ‘Content-Type‘ : ‘text/xml; charset=utf-8‘ }
conn = httplib.HTTPConnection(soap_host, soap_port, timeout=10)
conn.request(‘POST‘, ‘/‘, soap_body.encode(‘utf-8‘), req_header)
response = conn.getresponse()
data = http://www.mamicode.com/response.read()>

后来这个soap_body是可以使用的,服务端启动之后,启动这个文件的到结果为

PS D:\CodeHouse\python\web\webservice> python .\soaplib_test_http_client.py
<?xml version="1.0" ?>
<senv:Envelope xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:s12enc="http://www.w3.org/2003/05
/soap-encoding/" xmlns:s12env="http://www.w3.org/2003/05/soap-envelope/" xmlns:senc="http://schemas.xmlsoap.org/soap/enc
oding/" xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:
tns="tns" xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xml
ns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/
2001/XMLSchema-instance">
        <senv:Body>
                <tns:say_helloResponse>
                        <tns:say_helloResult>
                                <tns:string>Hello, Dave</tns:string>
                                <tns:string>Hello, Dave</tns:string>
                                <tns:string>Hello, Dave</tns:string>
                                <tns:string>Hello, Dave</tns:string>
                                <tns:string>Hello, Dave</tns:string>
                        </tns:say_helloResult>
                </tns:say_helloResponse>
        </senv:Body>
</senv:Envelope>


那么这个正确的soap格式是怎么找到的呢,还是使用上篇中说的suds客户端,只是把它发送到服务端的信息的log打印出来了,让后使用suds发送的消息格式来自己分装了下,然后调用就成功了。。

#coding: utf-8
__author__= ‘orangleliu‘
__version__ = ‘0.1‘

‘‘‘
filename: soaplib_test_suds.py
create date: 2014-05-12
debug sudus访问soaplib服务端的内容 来看看怎么用soap xml写http请求
参考文章:https://mail.python.org/pipermail/soap/2011-July/000494.html
‘‘‘

import logging
from suds.client import Client

if __name__ == ‘__main__‘:
    logging.basicConfig(level=logging.INFO)
    logging.getLogger(‘suds.client‘).setLevel(logging.DEBUG)
    hello_client = Client(‘http://localhost:7789/?wsdl‘, cache=None)
    result = hello_client.service.say_hello("Dave", 5)
    print result

不过这也是一种解决问题的途径,因为restful api的兴起,webservice已经用的比原来少多了,但有时间还是要把wsdl格式研究下才好。