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

目录
  • WebService客户端接口调用及身份验证问题
  • Python调用WebService接口踩坑记录
    • 1.报错信息
    • 2.解决方法

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。

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

(0)

相关推荐

  • python使用suds调用webservice接口的方法

    最近做接口对接,遇到了.net开发的webservice接口,因为python第一次与webservice对接,连问带查,最后使用suds库来实现了 1.安装suds mac: sudo pip install suds linux: easy_install suds 也可以通过去官网下载suds代码,再本地安装 2. 引用初始化 >>> from suds.client import Client >>> url = 'http://www.gpsso.com/we

  • Python3 webservice接口测试代码详解

    一.使用python3做webervice接口测试的第三方库选择suds-jurko库,可以直接pip命令直接下载,也可以在pypi官网下载压缩包进行手动安装 二.安装好后,导入Client:from suds.client import Client.发送一条请求 from suds.client import Client url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl' client = Cli

  • python调用webservice接口的实现

    使用suds这个第三方模块 from suds.client import Client url = 'http://ip:port/?wsdl' cilent=Client(url) print cilent 查看webservice接口的具体信息: 调用接口方法,通常 client.service.methodname 实际测试过程中遇到的坑: 1.tns 值为Localhost 之前查看接口信息时,未发现tns="http://Localhost:4567/Interface.wsdl&q

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

    目录 WebService客户端接口调用及身份验证问题 Python调用WebService接口踩坑记录 1.报错信息 2.解决方法 WebService客户端接口调用及身份验证问题 最近由于业务需求,需要实现python Webservice的服务以及接口调用. 服务端代码可自行百度,这里主要描述客户端以及我遇到的HTTP身份验证的问题,不多说直接上代码. from suds.client import Client from suds.transport.http import HttpAu

  • 通过Python中的CGI接口讲解什么是WSGI

    目录 前言 为什么是 WSGI? WSGI 实施概略 1)Application 端 2)Server 端 3) 作为 middleware 其他资源: 前言 今天在 git.oschina 的首页上看到他们推出演示平台,其中,Python 的演示平台支持 WSGI 接口的应用.虽然,这个演示平台连它自己提供的示例都跑不起来,但是,它还是成功的勾起了我对 WSGI 的好奇心.一番了解,对该机制的认识,总结如下.如有不妥,还望斧正. 为什么是 WSGI? 写过网页应用的各位亲,应该对 CGI 有了

  • Python的净值数据接口调用示例分享

    代码描述:基于Python的净值数据接口调用代码实例 关联数据:净值数据 接口地址:https://www.juhe.cn/docs/api/id/25 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib from urllib import urlencode #---------------------------------- # 净值数据调用示例代码 - 聚合数据 # 在线接口文档:http://www.juhe.c

  • Python flask框架post接口调用示例

    本文实例讲述了Python flask框架post接口调用.分享给大家供大家参考,具体如下: from flask import Flask,render_template,request app = Flask(__name__) @app.route("/login",methods = ['POST','GET']) def login(): if request.method == "POST": username = request.form.get('u

  • 在Python中COM口的调用方法

    如下所示: import serial import time t = serial.Serial('com6', 115200) #USB COM number on your PC and the transfer bit rate of the COM port. print t.portstr #Display the working UART port number on your PC. n = t.write('logcat -c \r') n = t.write('ampclie

  • 浅析Python 中的 WSGI 接口和 WSGI 服务的运行

    HTTP格式 HTTP GET请求的格式: GET /path HTTP/1.1 Header1: Value1 Header2: Value2 Header3: Value3 每个Header一行一个,换行符是\r\n. HTTP POST请求的格式: POST /path HTTP/1.1 Header1: Value1 Header2: Value2 Header3: Value3 body data goes here... 当遇到连续两个\r\n时,Header部分结束,后面的数据全部

  • python中编写函数并调用的知识点总结

    能够调用自己编写的函数,这在很多开发语言中,都会用到一个叫做mian的主函数,这个函数一般都是程序的入口,当程序启动时,首先执行这个函数. 在Python中,main函数的主要作用就是你写的模块既可以导入到别的模块中用,也可以在模块本身执行使用.下面就来了解具体使用操作吧. 编写简单的函数并调用: def show(): print("这是一个简单的函数") print("无论如何,我都会输出") print("__name__变量为:"+__n

  • python中的mock接口开发示例详解

    什么是mock? mock在翻译过来有模拟的意思.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. Mock通常是指,在测试一个对象时,我们构造一些假的对象来模拟与其交互.而这些Mock对象的行为是我们事先设定且符合预期.通过这些Mock对象来测试对象在正常逻辑,异常逻辑或压力情况下工作是否正常,Mock的行为固定,它确保当你访问该Mock的某个方法时总是能够获得一个没有任何逻辑的直接就返回的预期结果.Mock接口就是用一些合理的手段构造对象去模拟真实接口. import f

  • JAVA中的Token 基于Token的身份验证实例

    最近在做项目开始,涉及到服务器与安卓之间的接口开发,在此开发过程中发现了安卓与一般浏览器不同,安卓在每次发送请求的时候并不会带上上一次请求的SessionId,导致服务器每次接收安卓发送的请求访问时都新建一个Session进行处理,无法通过传统的绑定Session来进行保持登录状态和通讯状态. 基于传统方法无法判断安卓的每次请求访问状态,故查询资料了解到Token,特殊的身份证验证.以下是网上搜寻资料所得,作为学习总结资料. 令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧.to

  • 深入解析Python中的WSGI接口

    概述 WSGI接口包含两方面:server/gateway 及 application/framework. server调用由application提供的可调用对象. 另外在server和application之间还可能有一种称作middleware的中间件. 可调用对象是指:函数.方法.类或者带有callable方法的实例. 关于application 函数.方法.类及带有callable方法的实例等可调用对象都可以作为the application object. WSGI协议要求: th

随机推荐