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 import Client
# 连接到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 import ImportDoctor, Import
from suds.xsd import sxbasic
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: <urlopen error [WinError 10060] 連線嘗試失敗,因為連線對象有一段時間並未正確回應,或是連線建立失敗,因為連線的主機無法回應。>
是因为 本机寻找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行
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd">中schemaLocation 改为本地xml路径
demo:
注****** 代码中 BASE_DIR 是django 项目中配置的根目录
以上都配置后 %95 的webservice 都可以访问,还可能是内部网,也有可能是webserver 你无权访问