Python中WebService客户端接口调用及身份验证的问题

 更新时间:2022年11月02日 16:46:16   作者:ajklsdnal  
这篇文章主要介绍了Python中WebService客户端接口调用及身份验证的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • Python中的通函数numpy.ufunc详解

    Python中的通函数numpy.ufunc详解

    这篇文章主要介绍了什么是通函数numpy.ufunc,简单说就是numpy的函数,因为numpy针对的是数组张量,因此,几乎每一个函数都是ufunc。本文针对ufunc的属性进行研究,需要的朋友可以参考下
    2023-04-04
  • Python re模块介绍

    Python re模块介绍

    这篇文章主要介绍了Python re模块介绍,需要的朋友可以参考下
    2014-11-11
  • python使用response.read()接收json数据的实例

    python使用response.read()接收json数据的实例

    今天小编就为大家分享一篇python使用response.read()接收json数据的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python实现以时间换空间的缓存替换算法

    Python实现以时间换空间的缓存替换算法

    缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速度很快。缓存就是把一些数据暂时存放于某些地方,可能是内存,也有可能硬盘。下面给大家介绍Python实现以时间换空间的缓存替换算法,需要的朋友参考下
    2016-02-02
  • Python存储读取HDF5文件代码解析

    Python存储读取HDF5文件代码解析

    这篇文章主要介绍了Python存储读取HDF5文件代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Django利用elasticsearch(搜索引擎)实现搜索功能

    Django利用elasticsearch(搜索引擎)实现搜索功能

    这篇文章主要介绍了Django利用elasticsearch(搜索引擎)实现搜索功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • python 打印dict的key与value方式

    python 打印dict的key与value方式

    这篇文章主要介绍了python 打印dict的key与value方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 使用Python实现Mysql数据库相关操作详解

    使用Python实现Mysql数据库相关操作详解

    这篇文章主要介绍了使用Python实现Mysql数据库相关操作详解,pymysql是Python中操作数据库的第三方模块,通过这个模块的相关方法,我们可以连接并且去操作mysql数据库,需要的朋友可以参考下
    2023-08-08
  • 在VSCode中添加Python解释器并安装Python库的方法

    在VSCode中添加Python解释器并安装Python库的方法

    这篇文章主要介绍了在VSCode中添加Python解释器并安装Python库的方法,本文分步骤通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • python自动化之Ansible的安装教程

    python自动化之Ansible的安装教程

    这篇文章主要介绍了python自动化之Ansible的安装方法,结合实例形式分析了自动化运维工具Ansible的安装步骤及相关操作命令,需要的朋友可以参考下
    2019-06-06

最新评论