Python中WebService客户端接口调用及身份验证的问题
作者:ajklsdnal 发布时间:2021-12-22 06:01:05
WebService客户端接口调用及身份验证问题
最近由于业务需求,需要实现python Webservice的服务以及接口调用。
服务端代码可自行百度,这里主要描述客户端以及我遇到的HTTP身份验证的问题,不多说直接上代码。
from suds.client import Client
from suds.transport.http import HttpAuthenticated
import base64
import urllib2
# 一:无需身份验证的简单调用
url = "http://localhost:8899/?wsdl"
client = Client(url) # 可以print client进行相关信息查看
client.service.methodName(*args) # 方法调用
req = str(client.last_sent()) # 保存请求报文,因为返回的是一个实例,所以要转换成str
response = str(client.last_received()) # 保存返回报文,返回的也是一个实例
# 二:需要身份验证的调用
# 1.
client = Client(url=wsdl_url, username=username, password=password)
# 2.
t = HttpAuthenticated(username=username, password=password)
client = Client(url=url, transport=t)
# 3.
t = HttpAuthenticated(username=username, password=password)
t.handler = urllib2.HTTPBasicAuthHandler(t.pm) # 这种我的报错了,t.pm告知我没这个对象
t.urlopener = urllib2.build_opener(t.handler)
client = Client(url=wsdl_url, transport=t)
# 4.
base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
authenticationHeader = {
"SOAPAction" : "ActionName",
"Authorization" : "Basic %s" % base64string
}
client = Client(url=wsdl_url, headers=authenticationHeader)
这是我针对身份验证做的一些资料搜集、汇整。
Python调用WebService接口踩坑记录
应用场景:
需要与某运营商的某部门进行某些数据的对接,对方扔了一个接口文档过来,需要根据文档中的WebService接口规范进行数据的上报。但是在调用对面接口的时候,一直返回500。虽然状态码是500,但是根据报错信息以及给钱就是大爷的原则,最后还是需要调整自身的脚本文件来完成对接。
1.报错信息
一开始跟大部分帖子使用的第三方库一样,我也是使用了suds库。
#步骤很简单,导入相关库,定义url获取返回即可
import suds
from suds.client import Client
url='xxx'
client=Clinet(url)
result = client.service.xxx('xxx') #第一个xxx是webservice接口中你要调用的函数名,第二个xxx是你要输入的参数。如果不需要就空着。假如是复杂参数,可以使用client.factory方式来构建。
上述三个步骤就能够调用最简单的webservice接口了。
但是。。。。。
按理说是很简单的一个步骤,没想到卡我好几天。
1.1报错信息一
suds.WebFault: Server raised fault: 'Fault occurred while processing
百度了以后,大部分帖子解释的错误原因是由于上传的数据中存在空值,需要将空值替换成NULL等等。
所以我就想着是否是数据出了问题,然后检查了一下自己传入的数据有没有少了某个字段,或者某些字段是空着的
然后对着接口文档一阵猛看,最后发现自己的数据很标准,甚至找到了接口文档中好些错别字。。。
然后就怀疑是否跟xml数据的格式有关系,缩进换行啥的。。然后引发了第二个报错。
1.2报错信息二
Error reading XMLStreamReader: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs.
at [row,col {unknown-source}]: [2,5]
这个报错信息说的是我这边的xml开头不规范,但是我一看我的数据:
<?xml version="1.0" encoding="utf-8"?>
这很标准啊,也丝毫没有问题。。。
然后百度了说是得在数据前后加
<![CDATA[ ]]>
然后接着一通瞎操作也没有解决上述两个报错的任何一个。。。
但是。。。我最后还是绕过了500,成功调用!
2.解决方法
最后的解决方法就是使用requests库,不得不说这个库是真的顶,yyds!!!
webservice接口本质上就是使用HTTP的POST请求,只不过他post过去的是xml格式的数据。之所以很多人使用suds库是因为该库能自动组装好相应xml开头,比如
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sam="http://service.springboot.huaxun.com/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
xxxxxxxxxxxxxxx
</soap:Body>
</soap:Envelope>
下方的代码实际上是输入Body中的数据。
result = client.service.xxx('xxx')
然后suds会自动组装好数据并post出去。
所以理论上,suds库能完成的requests库也可以完成,只不过xml得我们自己来组装了。
造成报错一的主要原因是命名空间未正确指定,由于网上该库的教程很少,我也没能成功从源码中找到对命名空间的修改方式,所以使用了requests。
url='xxx'
str3='xxx'
header={
'Content-Type':'text/xml; charset=utf-8',
}
r = requests.post(url,headers=header,data=str3.encode('utf-8'))
print(r)
print(r.text)
打完收工!
有些遗憾的是,仍未成功使用suds调用成功!不清楚如何指定调用函数的namespace。
来源:https://blog.csdn.net/ajklsdnal/article/details/107611049


猜你喜欢
- 使用scipy.optimize模块的root和fsolve函数进行数值求解线性及非线性方程,下面直接贴上代码,代码很简单from scip
- 注意,下述部分主要与DOUBLE和FLOAT列相关,原因在于浮点数的不准确本质。MySQL使用64位十进制数值的精度执行DECIMAL操作,
- 端口扫描是非常实用的,不止用在信息安全方面,日常的运维也用得到。这方面的工具也不要太多,搞过 CTF 的朋友会告诉你有多少端口扫描工具,那为
- 修改配置文件:vim /usr/local/php/etc/php.ini[Phar]phar.readonly = Off压缩:a. 创建
- 计算机为数组分配一段连续的内存,从而支持对数组随机访问;由于项的地址在编号上是连续的,数组某一项的地址可以通过将两个值相加得出,即将数组的基
- 针对现在大部分的网站都是使用js加密,js加载的,并不能直接抓取出来,这时候就不得不适用一些三方类库来执行js语句execjs,一个比较好用
- OpenCV的作用及安装OpenCV简介OpenCV是一个开源的跨平台计算机视觉库,可以运行在Linux、Windows、Android和M
- 在开发应用程序时,客户端(前端页面或APP)与服务端交互是在所难免的,在交互过程传递数据时,最通用和流行格式便是JSON,Go语言提供了en
- 在运维场景下,我们经常需要在服务器上用正则表达式来匹配IP地址。shell和其它编程语言一样,也可以使用正则分组捕获,不过不能使用 $1或\
- 1、开源库 Web 领域:Sanic https://github.com/channelcat/sanic这个库的名字和之前一个
- 随着技术的不断升级,微软的王牌数据库SQL Server 2000正在逐渐淡出人们的视线,而新版的SQL Server 2005正成为企业和
- 如下所示:#利用小波分析进行特征分析#参数初始化inputfile= 'C:/Users/Administrator/Desktop
- MySQL出现乱码的原因要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些
- 时区的概念与转换首先要知道时区之间的转换关系,其实这很简单:把当地时间减去当地时区,剩下的就是格林威治时间了。 例如北京时间的18:00就是
- 导入库和数据首先,我们需要导入PyTorch和PyG库,然后准备好我们的数据。例如,我们可以使用以下方式生成一个简单的随机数据集:from
- USE [数据库名称]; --1.定义需要查找的关键字。在搜索中,使用模糊搜索:LIKE '%@key_find%'
- 使用ktl工具实现mysql向mysql同步数据1.新建作业步骤2.完善作业步骤,主要是完成作业中的转换工作3.首先要确定数据来源库,也就是
- 误区 #16:多个关于数据的损坏和修复误区 坊间流传的很多版本都不正确 我已经听过很多关于数据修复可以做什么、不可以做什么、什么会导致数据损
- numpy模块下的median作用为: 计算沿指定轴的中位数返回数组元素的中位数其函数接口为:median(a, axis=None, ou
- 翻译:ShiningRay @ Nirvana Studio作者:Douglas Crockford来源:http://www.crockf