1

我正在尝试使用下面的代码进行 api 调用,它工作正常

import urllib2
import urllib
import hashlib
import hmac
import base64


baseurl='http://www.xxxx.com:8080/client/api?'
request={}
request['command']='listUsers'
request['response']='xml'
request['apikey']='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
secretkey='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
request_str='&'.join(['='.join([k,urllib.quote_plus(request[k])]) for k in request.keys()])
sig_str='&'.join(['='.join([k.lower(),urllib.quote_plus(request[k].lower().replace('+','%20'))])for k in sorted(request.iterkeys())])
sig=hmac.new(secretkey,sig_str,hashlib.sha1)
sig=hmac.new(secretkey,sig_str,hashlib.sha1).digest()
sig=base64.encodestring(hmac.new(secretkey,sig_str,hashlib.sha1).digest())
sig=base64.encodestring(hmac.new(secretkey,sig_str,hashlib.sha1).digest()).strip()
sig=urllib.quote_plus(base64.encodestring(hmac.new(secretkey,sig_str,hashlib.sha1).digest()).strip())
req=baseurl+request_str+'&signature='+sig
res=urllib2.urlopen(req)
result = res.read()
print result

我想知道如何通过 Api 调用发送附加参数?以及当我将数据发送到云堆栈而不是从云堆栈获取时如何发送参数,例如 createuser

4

1 回答 1

1

request字典中添加其他参数。

例如 listUsers 允许列出特定用户名的详细信息(listUsers API 参考)。为此,您request将按如下方式更新创建:

request={}
request['command']='listUsers'
request['username']='admin'
request['response']='xml'
request['apikey']='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

签名规则说“小写整个命令字符串,并通过每个字段值对的字段按字母顺序对其进行排序”文档的这一部分还包括向 URL 添加到期时间。

最后,您需要通过使每个 HTTP GET 唯一来确保 HTTP GET 不会被网络基础设施缓存。CloudStack API 使用缓存破坏器。或者,您可以为每个查询添加过期时间,或使用 HTTP POST。

于 2014-01-02T14:41:13.190 回答