Python中调用WebService客户端接口需要使用第三方库,比较常用的有suds和zeep等库。在进行WebService客户端接口调用时,有时需要进行身份验证,常用的身份验证方式有Basic Authentication、OAuth等方式。
以下是Python中WebService客户端接口调用及身份验证的步骤和示例说明。
1. 安装suds或zeep库
使用pip安装suds或zeep库,例如:
pip install suds
或
pip install zeep
2. 创建客户端对象
使用suds或zeep库创建WebService客户端对象,例如:
使用suds库创建客户端对象:
from suds.client import Client
url = 'http://webservice.example.com/test?wsdl'
client = Client(url)
使用zeep库创建客户端对象:
from zeep import Client
url = 'http://webservice.example.com/test?wsdl'
client = Client(url)
3. 执行操作
使用客户端对象执行WebService客户端接口操作,例如:
使用suds库执行操作:
result = client.service.say_hello('world')
print(result)
使用zeep库执行操作:
result = client.service.say_hello('world')
print(result)
4. 身份验证
有些WebService客户端接口需要进行身份验证才能访问,下面介绍两种常用的身份验证方式。
4.1 Basic Authentication
Basic Authentication是一种简单的身份验证方式,客户端发送HTTP请求时将用户名和密码经过Base64编码后放在请求头中Authorization字段中,服务器收到请求后解码验证。
使用suds或zeep库实现Basic Authentication身份验证,需要自定义Transport对象并使用该对象创建客户端对象。
以下是suds库实现Basic Authentication的示例:
from suds.client import Client
from suds.transport.http import HttpTransport
url = 'http://webservice.example.com/test?wsdl'
username = 'myusername'
password = 'mypassword'
class CustomTransport(HttpTransport):
def send(self, request):
request.headers['Authorization'] = 'Basic %s' % (
base64.b64encode(('%s:%s' % (username, password)).encode('utf-8')).decode('ascii')
)
return super(CustomTransport, self).send(request)
transport = CustomTransport()
client = Client(url, transport=transport)
result = client.service.say_hello('world')
print(result)
以下是zeep库实现Basic Authentication的示例:
from zeep import Client
from requests.auth import HTTPBasicAuth
url = 'http://webservice.example.com/test?wsdl'
username = 'myusername'
password = 'mypassword'
transport = Transport(http_auth=HTTPBasicAuth(username, password))
client = Client(url, transport=transport)
result = client.service.say_hello('world')
print(result)
4.2 OAuth
OAuth是一种更为安全的身份验证方式,需要预先在“客户端”(即调用方)和“服务提供方”中注册应用,并使用应用的密钥进行身份验证。
使用Python实现OAuth身份验证,常用的库有oauthlib、requests-oauthlib等库。
以下是使用oauthlib库实现OAuth身份验证的示例:
from suds.client import Client
from suds.transport.http import HttpTransport
from oauthlib.oauth1 import Client as OAuthClient
from oauthlib.oauth1 import SIGNATURE_RSA
from datetime import datetime
url = 'http://webservice.example.com/test?wsdl'
client_key = 'YOUR_CLIENT_KEY'
client_secret = 'YOUR_CLIENT_SECRET'
access_token = 'YOUR_ACCESS_TOKEN'
access_secret = 'YOUR_ACCESS_SECRET'
oauth_server = 'https://api.example.com/oauth'
rsa_key = '/path/to/your/rsa/key'
class CustomTransport(HttpTransport):
def send(self, request):
oauth_client = OAuthClient(
client_key=client_key,
client_secret=client_secret,
resource_owner_key=access_token,
resource_owner_secret=access_secret,
signature_method=SIGNATURE_RSA,
rsa_key=rsa_key,
timestamp=datetime.now().strftime('%s'),
nonce=nonces.get_nonce()
)
headers = oauth_client.sign(request.url, request.headers, request.body)
request.headers.update(headers)
return super(CustomTransport, self).send(request)
transport = CustomTransport()
client = Client(url, transport=transport)
result = client.service.say_hello('world')
print(result)
以上是Python中WebService客户端接口调用及身份验证的完整攻略。