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 你無權訪問,有其他問題可以私下聯系博主 : 郵箱 suwhatsu@163.com