使用参数调用云堆栈

时间:2014-01-02 07:02:51

标签: rest python-2.7 apache-cloudstack

我正在尝试使用以下代码进行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调用发送附加参数? 以及当iam将数据发送到云堆栈而不是从云堆栈中获取时如何发送参数 例如createuser

1 个答案:

答案 0 :(得分:1)

将其他参数添加到request字典中。

E.g。 listUsers允许列出特定用户名的详细信息(listUsers API Reference)。为此,您需要按如下方式更新request创建:

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

同样 the Rules for Signing对“小写整个命令字符串并按字母顺序对每个字段 - 值对的字段进行排序”文档的这一部分还包括添加到期字符串到网址。

最后,您需要通过使每个HTTP GET唯一来确保网络基础架构不缓存HTTP GET。 CloudStack API使用cache buster。或者,您可以add an expiry to each query,或使用HTTP POST。