Python 调用webservice服务

python 可以作为webservice的客户端以及服务端,本文主要是以讲述,python作为客户端怎么来调用 基于soap 的webservice 

本文的代码 是python3.X版本

 

前置条件

  1. Python访问webservice接口用到的工具包是suds,但是由于该工具包没有在维护了,本文使用suds的分支项目suds-community
  2. 安装suds-communitypip install suds-community 博主测试过 suds-py3包  以及suds-jurko
  3. 免费的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%左右的问题:

示例常见的错误:

python处理soap返回 python soap请求_python处理soap返回

 

 

 

python处理soap返回 python soap请求_命名空间_02

 

以下是常见的两种错误方式:

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

python处理soap返回 python soap请求_命名空间_03

 

将它的只添加到过滤的命名空间就能解决问题。

但是一旦使用这个方法。速度会变得很慢, 解决速度变慢以下方式可以解决这个问题

 

触发 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:

python处理soap返回 python soap请求_命名空间_04

 

注******   代码中 BASE_DIR 是django 项目中配置的根目录

以上都配置后 %95 的webservice 都可以访问,还可能是内部网,也有可能是webserver 你无权访问