Python 调用webservice服务
python 可以作为webservice的客户端以及服务端,本文主要是以讲述,python作为客户端怎么来调用 基于soap 的webservice
服务端可以参考:
本文的代码 是python3.X版本
前置条件
Python访问webservice接口用到的工具包是suds,但是由于该工具包没有在维护了,本文使用suds的分支项目suds-community
安装suds-community,pip install suds-community 博主测试过 suds-py3包 以及suds-jurko 这三个包都可以用
免费的webservice网站,http://www.webxml.com.cn/zh_cn/web_services.aspx。
准备好前置条件后
from suds.client importClient#连接到webservice服务,获取查询天气服务方法
client=Client('http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl')print(client)
#### 一定要注意URL后一定要加 ?wsdl
如果连接没问题,就可以直接调用webservice中的方法 , 详细的访问名以及调用的方法可以直接 URL中查看
调用方法如下:
#查询手机号码归属地
print(client.service.getMobileCodeInfo("18300000000",""))#18300000000:广东 深圳 广东移动全球通卡
经常会出现的问题集合
配置以下几点可以解决95%左右的问题:
示例常见的错误:
以下是常见的两种错误方式:
from suds.client import Client
from suds.xsd.doctor importImportDoctor, Importfrom suds.xsd importsxbasic sxbasic.Import.bind('http://www.w3.org/2001/XMLSchema', 'file:' + str(BASE_DIR) + '/runCIA/suds/XMLSchema.xml')
imp= Import('http://www.w3.org/2001/XMLSchema')
# 添加过滤空间
imp.filter.add('http://www.innolux.com/InnoLux/WebServices')
doctor=ImportDoctor(imp)
verification_url= 'http://xxxxxxxxxxx/xxxxxx/xxxxxxxx.asmx?wsdl'verification_client= Client(verification_url, doctor=doctor)
触发suds.TypeNotFound: Type not found: '(schema, http://www.w3.org/2001/XMLSchema, )错误,
错误的原因是没有正确的引入命名空间。
解决办法,用浏览器打开webservice服务链接(打开以上代码的URL 地址),找到webservice服务中的targetNamespace,
将它的只添加到过滤的命名空间就能解决问题。
但是一旦使用这个方法。速度会变得很慢, 解决速度变慢以下方式可以解决这个问题
触发 urllib.error.URLError:
是因为 本机寻找XMLSchema.xsd比较慢
1.下载http://www.w3.org/2001/XMLSchema.xsd和http://www.w3.org/2001/xml.xsd
分别保存为XMLSchema.xml 和 xml.xml (改文件后缀)放在本机项目中下
1.添加sxbasic.Import.bind
sxbasic.Import.bind('http://www.w3.org/2001/XMLSchema', 'file:文件目录地址/XMLSchema.xml')
2.在XMLSchema.xml的 91行
中schemaLocation 改为本地xml路径
demo:
注****** 代码中 BASE_DIR 是django 项目中配置的根目录
以上都配置后 %95 的webservice 都可以访问,还可能是内部网,也有可能是webserver 你无权访问,有其他问题可以私下联系博主 : 邮箱 suwhatsu@163.com