怎样用python解决网站HTTP的身份验证问题
Admin 2022-12-22 群英技术资讯 575 次浏览
最近由于业务需求,需要实现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)
这是我针对身份验证做的一些资料搜集、汇整。
应用场景:
需要与某运营商的某部门进行某些数据的对接,对方扔了一个接口文档过来,需要根据文档中的WebService接口规范进行数据的上报。但是在调用对面接口的时候,一直返回500。虽然状态码是500,但是根据报错信息以及给钱就是大爷的原则,最后还是需要调整自身的脚本文件来完成对接。
一开始跟大部分帖子使用的第三方库一样,我也是使用了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,成功调用!
最后的解决方法就是使用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。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的是有关Python中怎样实现ascii转中文的内容,小编觉得挺实用的,因此分享给大家做个参考,下文还有中文转ascii的方法,感兴趣的朋友就接着往下看吧。
这篇文章主要为大家介绍了python数据挖掘Apriori算法实现关联分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要介绍了利用Python+Selenium+Pytesseract实现图片验证码识别,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
对于图片强行被定义高和宽会变形,我们希望图片被改变大小后,比例保持不变,完成对图片的压缩,下面这篇文章主要给大家介绍了关于如何使用python对图片进行批量压缩的相关资料,需要的朋友可以参考下
这篇文章主要为大家介绍了python人工智能遗传算法示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008